Как я могу ускорить этот метод, который удаляет текст из строки?

Я записал следующий метод для удаления пространства имен в скобках из строк.

Я хотел бы сделать это максимально быстро.

Существует ли способ ускорить следующий код?

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;
        }
    }
}
6
задан Edward Tanguay 15 January 2010 в 13:58
поделиться

11 ответов

Вы можете попробовать параллелизм, так как оно не похоже, вам нужно синхронное лечение. Параллельный Foreach с Plinq сделает трюк.

Но если вы не можете дождаться, пока VS2010 официально выходит, вы можете попробовать Parallel Parallel.Foreach Parallel.Foreach от EMRE Aydinceren

3
ответ дан 10 December 2019 в 00:38
поделиться

Подход, по-видимому, быстро быстро. Но из строки у вас есть, я пришел к выводу, что имя обычно меньше, чем {URL}. Вы можете использовать метод .lastindexof (). Я думаю, что он начинается с конца строки

3
ответ дан 10 December 2019 в 00:38
поделиться

Вы пробовали это с помощью Regex и / или использовать StringBuilder вместо строки?

1
ответ дан 10 December 2019 в 00:38
поделиться

Если вы изменили скорость для пробела, вы можете один раз в данном массиве, и скопируйте символы, отличные от «{. *}» Отказ Это будет сохранять два звонка (.indexof () и .substring ()).

1
ответ дан 10 December 2019 в 00:38
поделиться

Самая медленная вещь там, безусловно, является 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 казней.

0
ответ дан 10 December 2019 в 00:38
поделиться
line.Substring(line.IndexOf('}') + 1);

незначительно быстрее.

0
ответ дан 10 December 2019 в 00:38
поделиться

Вместо вашего Foreach ...

for( int i=0;i<tests.Length;i++)
     Console.WriteLine( tests[i].Replace("}",null ) );
-1
ответ дан 10 December 2019 в 00:38
поделиться
-

Допустим, вы нашли ответ здесь. Я думаю, вам нужно рассмотреть, как будет выглядеть «решение» для следующего парня, который смотрит на ваш код.

Я возьму более читаемый код против пары миллисекунд в любой день.

2
ответ дан 10 December 2019 в 00:38
поделиться

Это происходит, например, при попытке доступа к строковой переменной в качестве хэша по ошибке.

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 в любом случае.

Поэтому, если этот код не является узким местом в вашем коде и у вас нет разумной спецификации временных требований для этого метода, я бы сосредоточил ваши усилия в другом месте.

1
ответ дан 10 December 2019 в 00:38
поделиться

Единственный другой подход будет использоваться Line.Remove (0, POS + 1); , но я думаю, что внутренне удаляют более сложный, затем подстрок, из-за Факт, что удаление также может разрезать что-то из середины.

Такая подстрока () должна быть постами.

0
ответ дан 10 December 2019 в 00:38
поделиться

Вы можете преобразовать вашу строку в xName и получите раздел «Имя» следующим образом.

((System.Xml.Linq.XName)"{http://company.com/Services/Types}ModifiedAt").LocalName
0
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: