|
![]() |
#1 |
Участник
|
Мне кажется что быстрее всего будет способ 1
Но ведь это совсем копейки. Чтобы что-то заметить надо блок кода с добавкой либо в цикле прокрутить либо завести десятки тысяч переменных которые и складывать. Хотя любые копейки в определенных условиях могут привести к тормозам Тормозит создание буфера. |
|
![]() |
#2 |
Участник
|
Вот что получилось у меня, на основании конкатенации 5 строк 20 тыщ раз
6.3. 7.0 В 6.3 разница была в 250!! раз В 7.0 разницы практически нет, с небольшим преимуществом операнда + |
|
|
За это сообщение автора поблагодарили: mazzy (2), alex55 (1). |
![]() |
#3 |
Участник
|
Если в 6.3 ранить в IL, то видим картину похожую на 7
Похоже что теперь += создает новую строку каждый раз. |
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (10). |
![]() |
#4 |
Участник
|
Цитата:
А вот то что в 6.3 операция += работает медленнее под CIL чем p-code это очень неприятно. Может можно это пофиксить ? Наверняка можно создать более оптимальный код без создания новой строчки. Тем более что оператор += используется очень часто. Так глядишь в некоторых задачах p-code обгонит CIL. Последний раз редактировалось Logger; 19.01.2017 в 16:33. |
|
![]() |
#5 |
Участник
|
|
|
![]() |
#6 |
Участник
|
|
|
![]() |
#7 |
Участник
|
X++: class RunnableClass1 { const int StringSite = 100000; public static Int64 PlusEquals() { System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Restart(); str s; for (int i = 1; i <= StringSite; i+=5) { s += int2Str(i); s += int2Str(i+1); s += int2Str(i+2); s += int2Str(i+3); s += int2Str(i+4); } var runtime = stopWatch.ElapsedMilliseconds; stopWatch.Stop(); return runtime; } public static Int64 Plus() { System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Restart(); str s; for (int i = 1; i <= StringSite; i+=5) { s = s + int2Str(i) + int2Str(i+1) + int2Str(i+2) + int2Str(i+3) + int2Str(i+4); } var runtime = stopWatch.ElapsedMilliseconds; stopWatch.Stop(); return runtime; } public static Int64 ThruStrFmt() { System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Restart(); str s; for (int i = 1; i <= StringSite; i+=5) { s = strFmt('%1%2%3%4%5%6', s, int2Str(i), int2Str(i+1), int2Str(i+2), int2Str(i+3), int2Str(i+4)); } var runtime = stopWatch.ElapsedMilliseconds; stopWatch.Stop(); return runtime; } public static Int64 ThruTextBuffer() { System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Restart(); TextBuffer tb = new TextBuffer(); for (int i = 1; i <= StringSite; i+=5) { tb.appendText(int2Str(i)); tb.appendText(int2Str(i+1)); tb.appendText(int2Str(i+2)); tb.appendText(int2Str(i+3)); tb.appendText(int2Str(i+4)); } tb.getText(); var runtime = stopWatch.ElapsedMilliseconds; stopWatch.Stop(); return runtime; } /// <summary> /// Runs the class with the specified arguments. /// </summary> /// <param name = "_args">The specified arguments.</param> public static void main(Args _args) { Box::info("START"); info(strFmt("+= took %1 ms", RunnableClass1::PlusEquals())); info(strFmt("+ took %1 ms", RunnableClass1::Plus())); info(strFmt("strFmt took %1 ms", RunnableClass1::ThruStrFmt())); info(strFmt("TextBuffer took %1 ms", RunnableClass1::ThruTextBuffer())); Box::info("DONE"); } } |
|
|
За это сообщение автора поблагодарили: Logger (5), Товарищ ♂uatr (1). |
Теги |
.net, cil, p-code, string, бега сферических коней;, производительность |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|