powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Теоретический вопрос. Что лучше StringBuilder или List<string> ?
11 сообщений из 36, страница 2 из 2
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626739
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
const int Count = 10000;//0;
        static IEnumerable<string> GetV()
        {
            for(var i=0;i<Count;i++)
            {
                yield return Guid.NewGuid().ToString();
            }
        }
        static void Measure(Action action, string str)
        {
            System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
            Console.WriteLine($"Начало {str}");
            stopwatch.Start();
            action();
            stopwatch.Stop();
            Console.WriteLine($"Окончание {str} - {stopwatch.ElapsedTicks}");
        }
        static void IEnumerable(IEnumerable<string> src)
        {
            var tmp = string.Concat(src);
        }
        static void array(string[] src)
        {
            var tmp = string.Concat(src);
        }
        static void StringBuilder(IEnumerable<string> src)
        {
            StringBuilder sb = new System.Text.StringBuilder();
            var tmp = src.Aggregate(sb, (a, b) => { a.Append(b); return a; });
        }
        static void Plus(IEnumerable<string> src)
        {
            var tmp = src.Aggregate((a, b) => a + b);
        }
        public static void Main(string[] args)
        {

            var data = GetV();
            Measure(() => IEnumerable(data), "IEnumerable");
            var data2 = data.ToArray();
            Measure(() => array(data2), "array");
            Measure(() => StringBuilder(data), "StringBuilder");
            Measure(() => Plus(data), "Plus");
           
            Console.ReadLine();
        }
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626744
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВЕсли будем иметь IEnumerable<T>, то лучше использовать String.Concat, он прячет в себя всю кухню со StringBuilder и несколько оптимизирован.
Если складываем в цикле заранее неизвестное количество строк, то лучше StringBuilder.

Хм, интересно, а когда в IEnumarable у нас стало «заранее известное» количество строк? :)
если оно например ICollection
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626782
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

так бенчмарки не снимают

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
    public class StringConcatArrayVsConcatEnumerableVsPlusVsStringBuilder
    {
        public const string Pattern = "Lorem ipsum dolor sit amet {0}";

        [Params(1, 2, 3, 4, 5, 10, 100, 1000)]
        public int N;

        public string[] _array;
        public IEnumerable<string> _enumarable;

        [GlobalSetup]
        public void Setup()
        {
            _array = new string[N];
            for (int i = 0; i < N; i++)
            {
                _array[i] = string.Format(Pattern, i);
            }
            _enumarable = _array.Where(p => p.Length > 0);
        }

        [Benchmark]
        public string StringConcatArray()
        {
            return string.Concat(_array);
        }

        [Benchmark]
        public string StringConcatEnumerable()
        {
            return string.Concat(_enumarable);
        }

        [Benchmark]
        public string StringPlus()
        {
            var result = string.Empty;
            for (int i = 0; i < N; i++)
            {
                result += _array[i];
            }
            return result;
        }

        [Benchmark]
        public string StringBuilder()
        {
            StringBuilder sb = new StringBuilder(string.Empty);
            for (int i = 0; i < N; ++i)
                sb.Append(_array[i]);
            return sb.ToString();
        }
    }



Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
BenchmarkDotNet=v0.10.13, OS=Windows 10 Redstone 3 [1709, Fall Creators Update] (10.0.16299.309)
Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical cores and 4 physical cores
Frequency=3515633 Hz, Resolution=284.4438 ns, Timer=TSC
  [Host]     : .NET Framework 4.7 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2633.0
  DefaultJob : .NET Framework 4.7 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2633.0


|                 Method |    N |             Mean |          Error |         StdDev |
|----------------------- |----- |-----------------:|---------------:|---------------:|
|      StringConcatArray |    1 |        23.982 ns |      0.5336 ns |      0.5480 ns |
| StringConcatEnumerable |    1 |        90.579 ns |      1.9072 ns |      1.7840 ns |
|             StringPlus |    1 |         2.080 ns |      0.0691 ns |      0.0646 ns |
|          StringBuilder |    1 |        75.652 ns |      1.5876 ns |      2.1195 ns |
|      StringConcatArray |    2 |        38.391 ns |      1.1010 ns |      1.0299 ns |
| StringConcatEnumerable |    2 |       115.673 ns |      1.4674 ns |      1.3008 ns |
|             StringPlus |    2 |        27.955 ns |      0.6238 ns |      0.7660 ns |
|          StringBuilder |    2 |       128.713 ns |      2.4715 ns |      2.7470 ns |
|      StringConcatArray |    3 |        53.161 ns |      1.4823 ns |      1.3865 ns |
| StringConcatEnumerable |    3 |       140.397 ns |      2.7629 ns |      2.8373 ns |
|             StringPlus |    3 |        61.647 ns |      1.2816 ns |      2.3434 ns |
|          StringBuilder |    3 |       183.974 ns |      3.5172 ns |      2.9370 ns |
|      StringConcatArray |    4 |        68.256 ns |      1.5190 ns |      1.6253 ns |
| StringConcatEnumerable |    4 |       168.524 ns |      3.7721 ns |      3.3439 ns |
|             StringPlus |    4 |        98.268 ns |      1.9251 ns |      1.9769 ns |
|          StringBuilder |    4 |       200.536 ns |      3.8869 ns |      4.1590 ns |
|      StringConcatArray |    5 |        84.529 ns |      1.6994 ns |      2.0870 ns |
| StringConcatEnumerable |    5 |       205.156 ns |      4.0338 ns |      3.7732 ns |
|             StringPlus |    5 |       141.269 ns |      2.8260 ns |      2.6434 ns |
|          StringBuilder |    5 |       263.829 ns |      5.3262 ns |      6.9256 ns |
|      StringConcatArray |   10 |       192.574 ns |      3.6537 ns |      3.4176 ns |
| StringConcatEnumerable |   10 |       320.524 ns |      7.0209 ns |     10.5085 ns |
|             StringPlus |   10 |       456.999 ns |      9.1500 ns |     13.1226 ns |
|          StringBuilder |   10 |       403.016 ns |      7.8949 ns |      9.3983 ns |
|      StringConcatArray |  100 |     1,692.187 ns |     32.0964 ns |     35.6750 ns |
| StringConcatEnumerable |  100 |     3,308.953 ns |     62.5501 ns |     58.5094 ns |
|             StringPlus |  100 |    18,656.566 ns |    283.2511 ns |    236.5275 ns |
|          StringBuilder |  100 |     2,268.374 ns |     44.5242 ns |     65.2631 ns |
|      StringConcatArray | 1000 |    17,235.003 ns |    342.9311 ns |    480.7415 ns |
| StringConcatEnumerable | 1000 |    26,465.476 ns |    393.4232 ns |    368.0083 ns |
|             StringPlus | 1000 | 1,882,589.542 ns | 35,917.8520 ns | 35,276.1300 ns |
|          StringBuilder | 1000 |    18,221.928 ns |    362.7353 ns |    496.5162 ns |
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626795
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttfkthatПрикол в том, что у string нет перегруженного оператора "+" - конструкция типа "s1 + s2" самим компилятором превращается в "String.Concat(s1, s2)". Сам совершенно случайно и неожиданно узнал это, только через 10 с лишним лет писательства на шарпе, при декомпиляции какой-то хрени :-)

Ну а по сути-то какая разница, каким образом получился String.Concat из "+"? Компилятор вообще очень многое может оптимизировать, убирать переменные, разматывать циклы и т.д.ну дак плюс писать компактнее.
А то начнут вместо него писать чччччччч.concat а это все равно одно и то же)).
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626803
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
String.Concat(array) везде выигрывает потому, что он зная количество элементов, собирает размер для итогового буфера, и выделяет память один раз, потом тупо копирует.
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626810
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttString.Concat(array) везде выигрывает потому, что он зная количество элементов, собирает размер для итогового буфера, и выделяет память один раз, потом тупо копирует.
Ну дак он же написал что пишем плюсы, а компилятор сам поправит.
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626815
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123hVosttString.Concat(array) везде выигрывает потому, что он зная количество элементов, собирает размер для итогового буфера, и выделяет память один раз, потом тупо копирует.
Ну дак он же написал что пишем плюсы, а компилятор сам поправит.

Смотри на результаты :)
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626837
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВ,

так бенчмарки не снимают


Рад, что ты освоил тот фрейворк :)

А я снимаю как снимаю.
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626848
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВРад, что ты освоил тот фрейворк :)

Я уже давно освоил, ща популизирую =)


ЕвгенийВА я снимаю как снимаю.

Смысл тратить время, и получать плавающие результаты.
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626863
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВРад, что ты освоил тот фрейворк :)

Я уже давно освоил, ща популизирую =)


ЕвгенийВА я снимаю как снимаю.

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

И что ты будешь делать со своим фреймворком, если надо в зависимости от результатов измерения выполнить определенное действие?
...
Рейтинг: 0 / 0
Теоретический вопрос. Что лучше StringBuilder или List<string> ?
    #39626864
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВТвой код не скомпилируешь даже, не присоединив стороннего пакета, не говоря уже об запуске.

Ну фиг знает, вам шашечки или ехать?

ЕвгенийВИ что ты будешь делать со своим фреймворком, если надо в зависимости от результатов измерения выполнить определенное действие?

Бенчмарки и измерения в рантайме, влияющие на логику это разные вещи, совершенно.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Теоретический вопрос. Что лучше StringBuilder или List<string> ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]