jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
to check the performance of regex over a native method Number.toLocaleString() and an array based implementation for number formatting in JavaScript.
Edit (v2):
In previous jsperf
, functions to be compared are defined inside test code. It means that it is not only comparing how fast those functions executes, but also how fast those functions are defined, which I believe is less interested to us. So they are moved to the Preparation code HTML section in this version.
Add an event handler for each test-case to check if the outcome is correct. Turn on console
to observe it.
In all functions, use ''+num
instead of num.toString()
to speed it up.
Extend the decimal part from .53
to .53880934
to see if that part can be handled correctly;
Add an event handler to let console
report results for easy copy/past.
Add my function commafy. Using char scan, it shows very promising performance.
Result when tested with Chrome 28 on Linux:
# Note: Following the discussion in http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript
<script>
var number = 343535353.53880934, v;
function formatNumber(num) {
var decimalPart = '';
num = ''+num;
if (num.indexOf('.') != -1) {
decimalPart = '.' + num.split('.')[1];
num = parseInt(num.split('.')[0]);
}
var array = (''+num).split('');
var index = -3;
while (array.length + index > 0) {
array.splice(index, 0, ',');
index -= 4;
}
return array.join('') + decimalPart;
};
function formatNumberRgx(num) {
var parts = (''+num).split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join(".");
};
function commafy( num){
var parts = (''+num).split("."), s=parts[0], i=L= s.length, o='',c;
while(i--){ o = (i==0?'':((L-i)%3?'':','))
+s.charAt(i) +o }
return o+'.'+parts[1]
}
ui.events.start.push( function(){
console.log('\n\n Testing start, number='
+ number+'\n\n' ) } )
for( var i=0, tcase; tcase=ui.benchmarks[i]; i++ )
{
if(window.console) tcase.events.complete=[
function(){
this.funcReturn = v;
console.log( '== test #'+ this.id
+ ' ('+ this.name + ') complete'
+ ', v= '+ v
)
}
]
}
ui.events.complete.push(
function(){
console.log('\n\n Result:\n' );
var tcases = ui.benchmarks;
var out= Array( tcases.length );
for( var i=0, tcase; tcase=tcases[i]; i++ )
{
console.log( tcase.name + ' = '
+ tcase.funcReturn + ', ops/sec= '
+ commafy( (''+tcase.hz).replace(/^\s*/,'')).split('.')[0]
)
}
}
)
</script>
Ready to run.
Test | Ops/sec | |
---|---|---|
1. without regex |
| ready |
2. with regex |
| ready |
3. toLocaleString |
| ready |
4. commafy |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.