Комментарии 29
А где вы взяли firefox 44? FF43 только сегодня должен стать Developer Edition. Или я чего то не понимаю?
0
Наивная сборка строки через slice работает быстрее регулярок:
var s = i.toString();
var o = [];
var l = s.length;
var off = l % 3;
var groups = Math.floor(l / 3);
var x;
if (off) {
o.push(s.slice(0, off));
}
for (x = 0; x < groups; x++) {
o.push(s.slice(off, off += 3));
}
var result = o.join("'");
console.log(result)
+2
Неа, в хроме 45.0.2454.93 m на win7 не быстрее
jsfiddle.net/rf7co2gj
результаты у меня
regex: 472.494ms
nativeSlice: 598.145ms
jsfiddle.net/rf7co2gj
результаты у меня
regex: 472.494ms
nativeSlice: 598.145ms
0
Чудеса)
У меня:
Хром:
regex: 985.489ms
nativeSlice: 393.228ms
regex: 1030.108ms
nativeSlice: 398.542ms
regex: 1016.810ms
nativeSlice: 412.375ms
Firefox:
regex: 608.23ms
nativeSlice: 999.5ms
regex: 573.7ms
nativeSlice: 898.71ms
regex: 613.18ms
nativeSlice: 933.68ms
IE:
regex: 1 766,432 мс
nativeSlice: 1 702,35 мс
regex: 1 651,024 мс
nativeSlice: 1 684,765 мс
regex: 1 760,125 мс
nativeSlice: 1 690,707 мс
Node.js:
regex: 667ms
nativeSlice: 374ms
regex: 748ms
nativeSlice: 392ms
regex: 764ms
nativeSlice: 380ms
0
Добавил в конец поста данные по вашему варианту.
0
Наивная сборка строки через числа работает быстрее наивной сборки через slice:
jsfiddle.net/5nzL3yLo
function mathPower (num){
if (num < 999)
return num;
return mathPower(~~(num / 1000)) + "'"
+ ("00"+(~~(num % 1000))).substr(-3,3);
}
jsfiddle.net/5nzL3yLo
+2
Спасибо. Попробовал в Node.js и консолях:
результат регулярки плюс по три результата вашего варианта
Node.Js
[ 0, 64840650 ]
[ 0, 16904683 ]
[ 0, 14002223 ]
[ 0, 15718417 ]
Chrome
80
102
101
98
Firefox
218
214
218
239
IE
215
193
204
186
0
Обновил конец статьи, добавил ваш вариант в тесты. У меня он выиграл на IE.
0
… если вы знаете нужную локаль заранее, лучше воспользоваться заменой по регулярному выражению…
Вы же сами пишете выше про конструктор. Да, как только вам стала известна локаль, то для Intl лучше предварительно создавать эм… форматтер
new Intl.NumberFormat([locales[, options]])
В таком случае он работает достаточно быстро. А регулярки не обеспечат вам поддержку всех локалей, Китайские, японские цифры или иврит все вам поломают, намучаетесь.
+3
Вот этот способ в пять раз быстрее регулярки:
var s = i.toString();
var l = s.length;
var result = '';
if (l > 15) result += s.slice(-18, -15) + "'";
if (l > 12) result += s.slice(-15, -12) + "'";
if (l > 9) result += s.slice(-12, -9) + "'";
if (l > 6) result += s.slice(-9, -6) + "'";
if (l > 3) result += s.slice(-6, -3) + "'";
result += s.slice(-3);
+1
То есть вы полагаетесь на длину
У меня (небольшой прирост только в Node.js):
Number.MAX_SAFE_INTEGER
? Интересное практичное упрощение.У меня (небольшой прирост только в Node.js):
Регулярка vs по три теста вашего способа
Хром:
80
99
97
99
Firefox:
218
599
633
656
IE:
215
377
370
358
Node.js:
[ 0, 64840650 ]
[ 0, 46075947 ]
[ 0, 53800444 ]
[ 0, 43452631 ]
0
Добавил в конец поста данные по вашему варианту.
0
function fmt(n) {
n = n.toString();
const l = n.length;
var s='',
i=0;
while(i<l){
if((l-i)%3 || !i){
s+=n[i++];
}else{
s+=','+n[i++];
}
}
return s;
}
+1
Спасибо!
Проверил, вроде бы по сравнению с регуляркой получается быстрее везде, кроме IE. Вот результаты — по три запуска, сначала регулярка, потом ваш вариант.
Проверил, вроде бы по сравнению с регуляркой получается быстрее везде, кроме IE. Вот результаты — по три запуска, сначала регулярка, потом ваш вариант.
Результаты
Node.Js
[ 0, 72634428 ]
[ 0, 35303136 ]
[ 0, 73739665 ]
[ 0, 38605069 ]
[ 0, 85149363 ]
[ 0, 39749604 ]
Chrome
98
36
119
36
91
34
Firefox
214
185
224
186
220
182
IE
186
266
175
277
185
302
+1
И еще
function fmt2(n) {
var s='';
while(n){
s=('000'+n%1000).slice(n>=1000 ? -3 : -n.toString().length)+s;
n=n/1000|0;
if(n) {
s=','+s;
}
}
return s;
}
+1
Спасибо. Новая табличка. В Хроме более чем в два раза быстрее предыдущего, в IE чуть медленнее, а вот в Firefox почему-то более чем в два раза медленнее по сравнению с fmt1:
Скриншоты:
0
Плюс самый разжёванный вариант (см. P.S. 4 в конце статьи).
0
Нет смысла заново инициализировать регулярку. Так же быстрее:
var pattern = new RegExp('\B(?=(?:\d{3})+$)', 'g');
i.toString().replace( pattern , ',' ); //А это в цикле
+1
и он оказался довольно быстрым, а в тестах на Firefox даже занял первое место.Я вижу, что во всех браузерах, кроме IE11,
slice_concatenate
имеет наибольшую скорость работы. exhaustion
на 3-5 местах. Может, я не туда смотрю?+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Скорость локального форматирования чисел