Я записал следующий метод для удаления пространства имен в скобках из строк.
Я хотел бы сделать это максимально быстро.
Существует ли способ ускорить следующий код?
using System;
namespace TestRemoveFast
{
class Program
{
static void Main(string[] args)
{
string[] tests = {
"{http://company.com/Services/Types}ModifiedAt",
"{http://company.com/Services/Types}CreatedAt"
};
foreach (var test in tests)
{
Console.WriteLine(Clean(test));
}
Console.ReadLine();
}
static string Clean(string line)
{
int pos = line.IndexOf('}');
if (pos > 0)
return line.Substring(pos + 1, line.Length - pos - 1);
else
return line;
}
}
}
Вы можете попробовать параллелизм, так как оно не похоже, вам нужно синхронное лечение. Параллельный Foreach с Plinq сделает трюк.
Но если вы не можете дождаться, пока VS2010 официально выходит, вы можете попробовать Parallel Parallel.Foreach Parallel.Foreach от EMRE Aydinceren
Подход, по-видимому, быстро быстро. Но из строки у вас есть, я пришел к выводу, что имя обычно меньше, чем {URL}. Вы можете использовать метод .lastindexof (). Я думаю, что он начинается с конца строки
Вы пробовали это с помощью Regex и / или использовать StringBuilder вместо строки?
Если вы изменили скорость для пробела, вы можете один раз в данном массиве, и скопируйте символы, отличные от «{. *}» Отказ Это будет сохранять два звонка (.indexof () и .substring ()).
Самая медленная вещь там, безусловно, является Console.Writeline (). Возьмите следующий пример:
public void TestCleanSpeed()
{
var start = DateTime.Now;
for (var i = 0; i < 10000; i++)
{
string[] tests = {
"{http://company.com/Services/Types}ModifiedAt",
"{http://company.com/Services/Types}CreatedAt"
};
foreach (var test in tests)
{
Console.WriteLine(Clean(test));
}
}
var end = DateTime.Now;
var ts = end - start;
Console.WriteLine(ts);
}
Если вы запускаете его как есть, это занимает почти шесть секунд. Затем снимите консоль .WRITELENE и вместо этого назначить var newtest = clean (тест);
. В моем тесте потребовалось меньше 0,02 секунды для 10000 казней.
line.Substring(line.IndexOf('}') + 1);
незначительно быстрее.
Вместо вашего Foreach ...
for( int i=0;i<tests.Length;i++)
Console.WriteLine( tests[i].Replace("}",null ) );
Допустим, вы нашли ответ здесь. Я думаю, вам нужно рассмотреть, как будет выглядеть «решение» для следующего парня, который смотрит на ваш код.
Я возьму более читаемый код против пары миллисекунд в любой день.
Это происходит, например, при попытке доступа к строковой переменной в качестве хэша по ошибке.
s = "a string"
s["position"] = "an other string"
IndexError: string not matched
from (irb):5:in `[]='
from (irb):5
-121--1604696- Я бы сказал, что несколько действий почти всегда имеет больше смысла. Я просто не думаю, что Android предназначен для постоянного переключения собственных взглядов - вы так много упускаете. Вы должны реализовать Back самостоятельно, вы не получаете никаких переходов между действиями, вы должны реализовать много внутренней логики, чтобы возобновить приложение в правильном состоянии. Если вы не разделяете приложение на Действия, в дальнейшем изменить поток работы приложения будет намного сложнее. Это также приводит к одной мегаактивности, которая может быть намного труднее для обработки, чем много небольших частей кода.
Мне трудно представить, что скорость действительно проблема; если это так, то что-то не так с тем, как вы инициализируете каждое действие. Например, я пытался передавать сериализуемые объекты между действиями, и это оказалось невероятно медленным; Когда я перешел на более быстрый метод прохождения объектов, скорость запуска Activities значительно возросла.
Кроме того, я думаю, что это говорит о том, что в руководящих принципах Android для разработки действий и задач вообще не упоминается переключение представлений; он центрируется вокруг конструкции Activity-as-View.
-121--693093-Вы уверены, что это узкое место в вашем коде? Каковы ваши требования к времени для этого метода? Вы профилировали код, который у вас есть сейчас, чтобы увидеть, соответствует ли он этим спецификациям?
Я бы предположил, что код, который у вас есть, почти оптимален. Как IndexOf
, так и Substring
вызывают небезопасный
код, чтобы выполнить все виды модных оптимизаций, которые будут недоступны для вас, если вы также не перейдете по небезопасному
маршруту. Если вы это сделаете, вы просто собираетесь в конечном итоге перезаписать IndexOf
и Substring
в любом случае.
Поэтому, если этот код не является узким местом в вашем коде и у вас нет разумной спецификации временных требований для этого метода, я бы сосредоточил ваши усилия в другом месте.
Единственный другой подход будет использоваться Line.Remove (0, POS + 1);
, но я думаю, что внутренне удаляют более сложный, затем подстрок, из-за Факт, что удаление также может разрезать что-то из середины.
Такая подстрока () должна быть постами.
Вы можете преобразовать вашу строку в xName
и получите раздел «Имя» следующим образом.
((System.Xml.Linq.XName)"{http://company.com/Services/Types}ModifiedAt").LocalName