TL; DR
Конкатенація швидша та послідовніша щодо швидкості. Але різниця дуже мала для 1 або 2 змінних (нижче .3 секунди для 100 мільйонів дзвінків).
Редагувати
Після другого запуску здається, що об'єднання в основному відбувається швидше з двох.
Отже, я хотів розширити відповідь analog-nico, надавши більш обширний тест, який також (трохи) розглядав масштабованість двох функцій.
Код на пастебіні
Я вирішив використовувати чотири тестові приклади для кожної функції, маючи змінну спереду, одну в кінці, одну посередині та дві змінні посередині. Базова настройка однакова. Я просто використовую 100 000 000 ітерацій функції, і ці ітерації виконуються 100 разів. Я використовував ті самі механізми для запобігання оптимізації, а саме отримання суми довжин результуючих рядків та реєстрацію в ньому. Я також зафіксував необхідний час (щоб я здогадався, скільки часу це займе), але також записав його в масив.
Потім я розрахував середнє, мінімальне, максимальне та стандартне відхилення для кожного методу.
Ось результати:
{
sum: {
t: {
start: 2072751,
mid: 2338476,
end: 2083695,
double: 2950287
},
c: {
start: 2086059,
mid: 2345551,
end: 2074732,
double: 2922929
}
},
avg: {
t: {
start: 20727.51,
mid: 23384.76,
end: 20836.95,
double: 29502.87
},
c: {
start: 20860.59,
mid: 23455.51,
end: 20747.32,
double: 29229.29
}
},
sd: {
t: {
start: 335.6251329981114,
mid: 282.9490809315344,
end: 286.2220947096852,
double: 216.40844045461824
},
c: {
start: 255.4803356424913,
mid: 221.48744862858484,
end: 238.98242111084238,
double: 209.9309074433776
}
},
min: {
t: {
start: 20490,
mid: 23216,
end: 20588,
double: 29271
},
c: {
start: 20660,
mid: 23258,
end: 20534,
double: 28985
}
},
max: {
t: {
start: 23279,
mid: 25616,
end: 22887,
double: 30843
},
c: {
start: 22603,
mid: 25062,
end: 22403,
double: 30536
}
}
}
значення в t
-об'єкти призначені для шаблонів, значення в c
-об'єкти призначені для об'єднання. start
означає, що змінна знаходиться на початку, в середині - в середині, в кінці - у кінці, а вдвічі - дві змінні. sum
- це сума всіх 100 прогонів. avg
це середній пробіг, тобто він є sum / 100
. sd
Ось найпростіший вихід, wikipedia (проста англійська) . min
і max
є мінімальним та максимальним значенням циклу відповідно.
Результати
Здається, шаблони швидші для одиничних змінних, які не розташовані в кінці рядка, враховуючи, що середнє значення нижче, а мінімальне нижче. Якщо ви поміщаєте змінну в кінець рядка або маєте кілька змінних у своєму рядку, конкатенація відбувається швидше.
Незважаючи на те, що мінімальний, а також середнє значення шаблонів є кращими, ніж їх аналоги для конкатенації щодо перших двох умов, стандартне відхилення стабільно гірше. Здається, різниця зменшується з більшою кількістю змінних (потрібно більше тестів).
Оскільки більшість шаблонів, ймовірно, не будуть використовуватися лише для однієї змінної в рядку, варто лише сказати, що дотримання конкатенації дає кращу продуктивність. Але різниця (принаймні наразі) дуже незначна. При оцінках 100 000 000 (100 мільйонів) з двома змінними різниця становить лише 273,58 мс, приблизно чверть секунди ...
Другий запуск
Другий запуск виглядає дещо інакше. За винятком максимального значення, середнього абсолютного відхилення та стандартного відхилення, кожне вимірювання підтверджує, що конкатенація швидша, ніж шаблони.
Три згадані вимірювання мали нижчі (отже, кращі) значення для шаблонів, коли змінна знаходилася в кінці рядка або коли в рядку було дві змінні.
Ось результати:
{
"sum": {
"t": {
"start": 1785103,
"mid": 1826679,
"end": 1719594,
"double": 2110823,
"many": 4153368
},
"c": {
"start": 1720260,
"mid": 1799579,
"end": 1716883,
"double": 2097473,
"many": 3836265
}
},
"avg": {
"t": {
"start": 17851.03,
"mid": 18266.79,
"end": 17195.94,
"double": 21108.23,
"many": 41533.68
},
"c": {
"start": 17202.6,
"mid": 17995.79,
"end": 17168.83,
"double": 20974.73,
"many": 38362.65
}
},
"sd": {
"t": {
"start": 858.7857061572462,
"mid": 886.0941856823124,
"end": 786.5366719994689,
"double": 905.5376950188214,
"many": 1744.9005638144542
},
"c": {
"start": 599.0468429096342,
"mid": 719.1084521127534,
"end": 935.9367719563112,
"double": 991.5642274204934,
"many": 1465.1116774840066
}
},
"aad": {
"t": {
"start": 579.1207999999996,
"mid": 576.5628000000003,
"end": 526.8268,
"double": 586.9651999999998,
"many": 1135.9432000000002
},
"c": {
"start": 467.96399999999966,
"mid": 443.09220000000016,
"end": 551.1318000000008,
"double": 610.2321999999999,
"many": 1020.1310000000003
}
},
"min": {
"t": {
"start": 16932,
"mid": 17238,
"end": 16387,
"double": 20016,
"many": 39327
},
"c": {
"start": 16477,
"mid": 17137,
"end": 16226,
"double": 19863,
"many": 36424
}
},
"max": {
"t": {
"start": 23310,
"mid": 24102,
"end": 21258,
"double": 26883,
"many": 49103
},
"c": {
"start": 19328,
"mid": 23203,
"end": 22859,
"double": 26875,
"many": 44352
}
},
"median": {
"t": {
"start": 17571,
"mid": 18062,
"end": 16974,
"double": 20874,
"many": 41171.5
},
"c": {
"start": 16893.5,
"mid": 18213,
"end": 17016.5,
"double": 20771,
"many": 38849
}
}
}
Код тут