Быстродействие объединения строк

93
05 января 2022, 15:40

Какой способ объединения строк следует когда использовать.

1 способ: "а" + "b"
2 способ: String.Concat("a","b")
3 способ: StringBuilder db = new StringBuilder("a").Append("b")

С точки зрения быстродействия, какой способ следует использовать, когда строки маленькие, и объединения небольшие ( до 10 строк)?

Какой способ использовать, когда строки большие по объему?

Answer 1

Считается, что StringBuilder следует использовать в случае, если у вас происходит конкатенация больших строк и/или все это происходит в цикле с большим числом итераций. Это обусловлено тем, что строки неизменяемы, а потому при каждом изменении строки на самом деле создается новая. При этом StringBuilder этого недостатка лишён. Вот вам небольшой тест, который, впрочем, не претендует на всеобъемлющую точность. Имеем четыре метода:

    private static long Plus(int counts)
    {
        string res = "";
        var watch = Stopwatch.StartNew();
        for (var i = 0; i < counts; i++)
        {
            res = res + DateTime.Now.ToString();
        }
        return watch.ElapsedMilliseconds;
    }
    private static long Concat(int counts)
    {
        string res = "";
        var watch = Stopwatch.StartNew();
        for (var i = 0; i < counts; i++)
        {
            res = String.Concat(res, DateTime.Now.ToString());
        }
        return watch.ElapsedMilliseconds;
    }
    private static long Format(int counts)
    {
        string res = "";
        var watch = Stopwatch.StartNew();
        for (var i = 0; i < counts; i++)
        {
            res = String.Format("{0}{1}", res, DateTime.Now.ToString());
        }
        return watch.ElapsedMilliseconds;
    }
    private static long Build(int counts)
    {
        StringBuilder res = new StringBuilder();
        var watch = Stopwatch.StartNew();
        for (var i = 0; i < counts; i++)
        {
            res = res.Append(DateTime.Now.ToString());
        }
        string res2 = res.ToString();
        return watch.ElapsedMilliseconds;
    }

Первый - для "обычного" сложения строк, второй для String.Concat, третий для String.Format, четвёртый - для StringBuilder.Append. Прогоняем их через различное количество итераций. Получаем вот что:

Plus(1000) - время выполнения 7 мс
Concat(1000) - время выполнения 3 мс
Format(1000) - время выполнения 8 мс
Build(1000) - время выполнения < 1 мс

Plus(2000) - время выполнения 13 мс
Concat(2000) - время выполнения 11 мс
Format(2000) - время выполнения 20 мс
Build(2000) - время выполнения  1 мс
Plus(5000) - время выполнения 66 мс
Concat(5000) - время выполнения 56 мс
Format(5000) - время выполнения 133 мс
Build(5000) - время выполнения  2 мс
Plus(10000) - время выполнения 266 мс
Concat(10000) - время выполнения 248 мс
Format(10000) - время выполнения 591 мс
Build(10000) - время выполнения  5 мс
Plus(20000) - время выполнения 1663 мс
Concat(20000) - время выполнения 1624 мс
Format(20000) - время выполнения 3925 мс
Build(20000) - время выполнения  10 мс

Выводы делайте сами

UPD по немногочисленным заявкам трудящихся добавил метод для String.Format. Не бог весть что, но для полноты картины сойдёт.

READ ALSO
Как получить объект нужного типа?

Как получить объект нужного типа?

У меня есть список с формами(SystemWindows

175
Форма закрывается с ошибкой

Форма закрывается с ошибкой

Пытаюсь сделать так, чтобы при изменении значения в comboBox база данных выводилась в datagridviewВроде бы все работает, но при закрытии формы выдает...

102
Строки в c#. String \ StringBuilder

Строки в c#. String \ StringBuilder

Ребят, у меня возникли вопросы по строкам в c#

100
Dependency Injection создает экземпляры разных типов

Dependency Injection создает экземпляры разных типов

У меня есть сервис по работе с JWT

97