Заменить строку. Разделить на другие конструкции - Оптимизация - PullRequest
0 голосов
/ 14 декабря 2011

Здесь я использую функцию Split для получения частей строки.

string[] OrSets = SubLogic.Split('|');
foreach (string OrSet in OrSets)
{
  bool OrSetFinalResult = false;
    if (OrSet.Contains('&'))
    {
        OrSetFinalResult = true;
        if (OrSet.Contains('0'))
        {
            OrSetFinalResult = false;
        }
        //string[] AndSets = OrSet.Split('&');
        //foreach (string AndSet in AndSets)
        //{
        //    if (AndSet == "0")
        //    {
        //        // A single "false" statement makes the entire And statement FALSE
        //        OrSetFinalResult = false;
        //        break;
        //    }
        //}

    }
    else
    {
        if (OrSet == "1")
        {
            OrSetFinalResult = true;
        }
    }

    if (OrSetFinalResult)
    {
        // A single "true" statement makes the entire OR statement TRUE
        FinalResult = true;
        break;
    }
}

Как я могу заменить операцию Split вместе с заменой конструкций foreach.

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Гипотеза # 1

В зависимости от типа вашего процесса вы можете распараллеливать работу:

var OrSets = SubLogic.Split('|').AsParallel();
foreach (string OrSet in OrSets)
{
  ...
  ....
}

Однако это часто может привести к проблемам с многопоточными приложениями (блокировка ресурса,так далее.).И вы также должны измерить выгоды.Переключение с одного потока на другой может быть дорогостоящим.Если задание невелико, AsParallel будет медленнее, чем простой последовательный цикл.

Это очень эффективно, когда у вас есть задержка с сетевым ресурсом или любой тип ввода / вывода.

Гипотеза# 2

Ваша переменная SubLogic очень очень очень большая

В этом случае вы можете последовательно пройти файл:

class Program
{
    static void Main(string[] args)
    {
        var SubLogic = "darere|gfgfgg|gfgfg";

        using (var sr = new StringReader(SubLogic))
        {

            var str = string.Empty;
            int charValue;
            do
            {
                charValue = sr.Read();
                var c = (char)charValue;
                if (c == '|' || (charValue == -1 && str.Length > 0))
                {
                    Process(str);
                    str = string.Empty; // Reset the string
                }
                else
                {
                    str += c;
                }
            } while (charValue >= 0);

        }

        Console.ReadLine();
    }

    private static void Process(string str)
    {
        // Your actual Job
        Console.WriteLine(str);
    }

Кроме того, в зависимости от длиныв каждом фрагменте между | вы можете использовать StringBuilder, а не простую конкатенацию строк.

1 голос
/ 14 декабря 2011

Скорее всего, если вам нужно оптимизировать для повышения производительности вашего приложения, то код внутри цикла foreach - это то, что нужно оптимизировать, а не метод string.Split.

[EDIT:]

В другом месте StackOverflow есть несколько хороших ответов, связанных с оптимизированным анализом строк:

String.Split (), вероятно, делает больше, чем вы можете сделать самостоятельно, чтобы фактически разделить строку в хорошо оптимизированном виде. Это предполагает, что вы заинтересованы в возврате true или false для каждого разделенного раздела вашего ввода, конечно. В противном случае вы можете просто сосредоточиться на поиске вашей строки.

Как уже упоминали другие, если вам нужно искать через огромную строку (много сотен мегабайт) и, особенно, делать это многократно и непрерывно, посмотрите, что .NET 4 дает вам с помощью Parallel Library Task .

Для поиска по строкам вы можете посмотреть в этом примере на MSDN, как использовать методы IndexOf, LastIndexOf, StartsWith и EndsWith. Они должны работать лучше, чем метод Contains.

Конечно, лучшее решение зависит от фактов вашей конкретной ситуации. Вы захотите использовать класс System.Diagnostics.Stopwatch , чтобы узнать, сколько времени занимает ваша реализация (как текущая, так и новая), чтобы увидеть, что работает лучше.

0 голосов
/ 14 декабря 2011

Вы могли бы справиться с этим, используя StringBuilder. Попробуйте прочитать char-by-char из вашей исходной строки в StringBuilder, пока не найдете '|', затем обработайте то, что содержит StringBuilder. Так вы избежите создания сотен String объектов и сэкономите много памяти.

Если бы вы использовали Java, я бы рекомендовал использовать классы StringTokenizer и StreamTokenizer. Жаль, что в .NET

нет похожих классов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...