Когда использовать StringBuilder?



Я понимаю преимущества StringBuilder.



но если я хочу объединить 2 строки, то я предполагаю, что это лучше (быстрее) сделать без StringBuilder. Это правильно?



в какой момент (количество строк) становится лучше использовать StringBuilder?

404   11  

11 ответов:

Я тепло предлагаю вам прочитать печальная трагедия микро-оптимизации театра, Джефф Этвуд.

Это относится к простой конкатенации и StringBuilder по сравнению с другими способами.

теперь, если вы хотите увидеть некоторые цифры и графики, перейдите по ссылке;)

но если я хочу объединить 2 строки, то я предполагаю, что это лучше (быстрее) обойтись без него класс StringBuilder. Это правильно?

это действительно правильно, вы можете найти, почему именно очень хорошо объяснил :

http://www.yoda.arachsys.com/csharp/stringbuilder.html

резюмировал : если вы можете конкатинировать строки за один раз, как

var result = a + " " + b  + " " + c + ..

вы лучше без stringbuilder только для при копировании производится (длина результирующей строки вычисляется заранее);

для таких структур, как

var result = a;
result  += " ";
result  += b;
result  += " ";
result  += c;
..

новые объекты создаются каждый раз, так что вы должны рассмотреть то StringBuilder.

В конце статьи подводятся итоги этих эмпирических правил:

Правила

Итак, когда вы должны использовать StringBuilder, и когда вы должны использовать строку операторы конкатенации?

  • определенно используйте StringBuilder, когда вы объединяетесь в нетривиальном петли - особенно если вы не знаете наверняка (во время компиляции) сколько итерации, которые вы сделаете через петля. Например, чтение файла характер в то время, создавая строка, как вы идете с помощью оператора += это потенциально самоубийство производительности.

  • определенно используйте конкатенацию оператор, когда вы можете (читабельно) укажите все, что должна стать объединены в одном заявлении. (Если вы есть множество вещей, чтобы конкатенация, подумайте о вызове Строка.Функция concat явно или Строка.Присоединяйтесь, если вам нужен разделитель.)

  • не бойтесь разбить литералы вверх на несколько сцепленных битов - результат будет тот же. Вы можете помочь удобочитаемость путем ломать длинный литерал в несколько строк, например, с никакого вреда для производительности.

  • Если вам нужно промежуточный результат конкатенации для чего-то кроме подачи следующей итерации конкатенации, StringBuilder не является Я помогу тебе. Например, если вы создаете полное имя от первого имя и фамилия, а затем добавить третья часть информации (в прозвище, может быть) до конца, вы будете только польза от использования StringBuilder если вам не нужно (имя + фамилия) строка для других целей (как это сделано в Примере, который создает человек объект.)

  • Если у вас есть только несколько конкатенаций делать, и вы действительно хотите их делать в отдельных заявлениях это не так действительно важно, в какую сторону вы идете. Который способ более эффективный будет зависеть от количество конкатенаций размеры из строки участвует, и какой порядок они связаны между собой. Если вы действительно поверьте, что кусок кода, чтобы быть узкое место производительности, профиль или проверьте это в обоих направлениях.

Не совсем так...вы должны использовать StringBuilder, если вы объединяете большой строки или у вас есть много конкатенаций, как в цикле.

но если я хочу объединить 2 строки, то я предполагаю, что это лучше (быстрее) сделать без StringBuilder. Это правильно?

да. Но что еще более важно, это значительно больше читабельный использовать ваниль strings в таких ситуациях. С другой стороны, использование его в цикле имеет смысл и также может быть читаемым, как конкатенация.

Я бы опасался эмпирических правил, которые приводят конкретные числа конкатенации в качестве порога. Использование его в циклах (и только циклы), вероятно, так же полезно, легче запомнить и имеет больше смысла.

нет окончательного ответа, только эмпирические правила. Мои собственные личные правила идут примерно так:

  • если конкатенация в цикле, всегда используйте StringBuilder.
  • если строки большие, всегда используйте StringBuilder.
  • если код конкатенации аккуратный и читаемый на экране, то это, вероятно, нормально.
    Если это не так, используйте StringBuilder.

перефразируя

тогда считай до трех, ни больше, ни меньше. Три будет число, которое ты будешь считать, и число подсчета будет три. Четыре не считай, и два не считай, если только ты не перейдешь к трем. Как только число три, будучи третьим числом, будет достигнуто, тогда лоббируй Свою Святую ручную гранату Антиохии

Я обычно использую строковый конструктор для любого блока кода, который приведет к объединение трех или более строк.

  • Если вы объединяете строки в цикле, вы должны рассмотреть возможность использования StringBuilder вместо обычной строки
  • в случае, если это одна конкатенация, вы можете вообще не видеть разницы во времени выполнения

вот простой тест приложение, чтобы доказать свою точку зрения:

class Program
{
    static void Main(string[] args)
    {
        const int testLength = 30000;
        var StartTime = DateTime.Now;

        //TEST 1 - String
        StartTime = DateTime.Now;
        String tString = "test string";
        for (int i = 0; i < testLength; i++)
        {
            tString += i.ToString();
        }
        Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString());
        //result: 2000 ms

        //TEST 2 - StringBuilder
        StartTime = DateTime.Now;
        StringBuilder tSB = new StringBuilder("test string");
        for (int i = 0; i < testLength; i++)
        {
            tSB.Append(i.ToString());
        }
        Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString());
        //result: 4 ms

        Console.ReadLine();
    }
}

результаты:

  • 30'000 итераций

    • строка - 2000 МС
    • StringBuilder-4 ms
  • 1000 итераций

    • строка - 2 мс
    • StringBuilder-1 ms
  • 500 итераций

    • строка - 0 мс
    • StringBuilder-0 ms

пока вы можете физически ввести количество конкатенаций (a + b + c ...) это не должно иметь большого значения. N в квадрате (при N = 10) - это 100-кратное замедление, которое не должно быть слишком плохим.

большая проблема заключается в том, когда вы объединяете сотни строк. При N=100 вы получаете замедление в 10000X раз. Что довольно плохо.

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

для меня я не буду использовать StringBuilder, если просто объединю 2 огромные строки. Если есть цикл с неопределенным количеством, я, вероятно, буду, даже если цикл может быть небольшим количеством.

одна конкатенация не стоит использовать stringbuilder. Я, как правило, используется 5 конкатенации, как правило.

Comments

    Ничего не найдено.