version bump 0.2.0: performance
- used Int32Array for storing CRC32 table when possible - buf/array impl 4-step unrolling - integration performance tests
This commit is contained in:
		
							parent
							
								
									606138a7e9
								
							
						
					
					
						commit
						c79a8fb6c9
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,3 @@ | ||||
| node_modules | ||||
| misc/coverage.html | ||||
| misc/*/ | ||||
|  | ||||
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							| @ -51,3 +51,7 @@ coveralls-spin: | ||||
| .PHONY: perf | ||||
| perf: | ||||
| 	bash perf/perf.sh | ||||
| 
 | ||||
| .PHONY: perf-all | ||||
| perf-all: | ||||
| 	bash misc/perf.sh | ||||
|  | ||||
| @ -33,7 +33,12 @@ run `make ctest`. | ||||
| 
 | ||||
| ## Performance | ||||
| 
 | ||||
| `make perf` will run performance tests. | ||||
| `make perf` will run algorithmic performance tests (which should justify certain | ||||
| decisions in the code).   | ||||
| 
 | ||||
| `make perf-all` compares the performance of various crc-32 algorithms that | ||||
| implement the correct form (note that the SSE intrinsic is designed for the  | ||||
| CRC32C checksum and uses a different polynomial). | ||||
| 
 | ||||
| Unexpected code patterns were based on performance testing in node and browser: | ||||
| 
 | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| CRC32.version = '0.1.0'; | ||||
| CRC32.version = '0.2.0'; | ||||
|  | ||||
| @ -15,7 +15,7 @@ function signed_crc_table() { | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| 	return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table; | ||||
| } | ||||
| 
 | ||||
| var table = signed_crc_table(); | ||||
|  | ||||
| @ -1,17 +1,29 @@ | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| var use_buffer = typeof Buffer !== 'undefined'; | ||||
| function crc32_bstr(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf(Buffer(bstr)); | ||||
| 	var crc = -1, L = bstr.length - 1; | ||||
| 	for(var i = 0; i < L;) { | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	for(var crc = -1, i = 0, L=buf.length-3; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	} | ||||
| 	if(i < L+3) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		if(i < L+3) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 			if(i < L+3) { | ||||
| 				crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; }}} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										28
									
								
								crc32.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								crc32.js
									
									
									
									
									
								
							| @ -2,7 +2,7 @@ | ||||
| /* vim: set ts=2: */ | ||||
| var CRC32 = {}; | ||||
| (function(CRC32) { | ||||
| CRC32.version = '0.1.0'; | ||||
| CRC32.version = '0.2.0'; | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| @ -20,24 +20,36 @@ function signed_crc_table() { | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| 	return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table; | ||||
| } | ||||
| 
 | ||||
| var table = signed_crc_table(); | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| var use_buffer = typeof Buffer !== 'undefined'; | ||||
| function crc32_bstr(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf(Buffer(bstr)); | ||||
| 	var crc = -1, L = bstr.length - 1; | ||||
| 	for(var i = 0; i < L;) { | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	for(var crc = -1, i = 0, L=buf.length-3; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	} | ||||
| 	if(i < L+3) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		if(i < L+3) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 			if(i < L+3) { | ||||
| 				crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; }}} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| /* vim: set ts=2: */ | ||||
| var CRC32 = {}; | ||||
| (function(CRC32) { | ||||
| CRC32.version = '0.1.0'; | ||||
| CRC32.version = '0.2.0'; | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| @ -20,24 +20,36 @@ function signed_crc_table() { | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| 	return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table; | ||||
| } | ||||
| 
 | ||||
| var table = signed_crc_table(); | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| var use_buffer = typeof Buffer !== 'undefined'; | ||||
| function crc32_bstr(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf(Buffer(bstr)); | ||||
| 	var crc = -1, L = bstr.length - 1; | ||||
| 	for(var i = 0; i < L;) { | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	for(var crc = -1, i = 0, L=buf.length-3; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	} | ||||
| 	if(i < L+3) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		if(i < L+3) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 			if(i < L+3) { | ||||
| 				crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; }}} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -6,6 +6,98 @@ var bits = [ | ||||
| 	[ "foo bar baz٪☃🍣", 1531648243] | ||||
| ]; | ||||
| if(typeof module !== "undefined") module.exports = bits; | ||||
| if(typeof require !== 'undefined') { | ||||
| var js_crc32 = require('../'); | ||||
| var buffer_crc32 = require('./buffer-crc32'); | ||||
| var crc32 = require('./crc32'); | ||||
| var node_crc = require('./node-crc'); | ||||
| 
 | ||||
| function z1(bstr) { return js_crc32.bstr(bstr); } | ||||
| function z2(bstr) { return buffer_crc32.signed(bstr); } | ||||
| function z3(bstr) { return crc32(bstr); } | ||||
| function z4(bstr) { return node_crc.crc32(bstr);} | ||||
| 
 | ||||
| function b1(buf) { return js_crc32.buf(buf); } | ||||
| function b2(buf) { return buffer_crc32.signed(buf); } | ||||
| function b3(buf) { return crc32(buf); } | ||||
| function b4(buf) { return node_crc.crc32(buf); } | ||||
| 
 | ||||
| function u1(str) { return js_crc32.str(str); } | ||||
| function u2(str) { return buffer_crc32.signed(str); } | ||||
| 
 | ||||
| var ntests, len_max; | ||||
| switch(process.env.MODE) { | ||||
| 	case "A": ntests = 100000; len_max = 256; break; | ||||
| 	case "B": ntests = 10000; len_max = 1024; break; | ||||
| 	case "C": ntests = 10000; len_max = 4096; break; | ||||
| 	case "D": ntests = 1000; len_max = 16384; break; | ||||
| 	case "E": ntests = 1000; len_max = 65536; break; | ||||
| 	case "F": ntests = 100; len_max = 262144; break; | ||||
| 	default:  ntests = 10000; len_max = 1024; break; | ||||
| } | ||||
| 
 | ||||
| var btest = true, utest = true; | ||||
| 
 | ||||
| var bstr_tests = []; | ||||
| var ustr_tests = []; | ||||
| var len_min = 1; | ||||
| 
 | ||||
| var corpus = new Array(0x0800); | ||||
| for(var k = 0; k < 0x0800; ++k) corpus[k] = String.fromCharCode(k) | ||||
| len_max --; | ||||
| 
 | ||||
| k = (Math.random()*0x800)|0; | ||||
| for(var i = 0; i < ntests; ++i) { | ||||
| 	var l = (Math.random() * (len_max - len_min))|0 + len_min; | ||||
| 	var s = new Array(l), t = new Array(l); | ||||
| 	if(btest) for(var j = 0; j < l; ++j) s[j] = corpus[(i+j+k)&127]; | ||||
| 	if(utest) for(var j = 0; j < l; ++j) t[j] = corpus[(i+j+k)&0x7FF]; | ||||
| 	var ss = s.join(""); | ||||
| 	bstr_tests[i] = [ss, new Buffer(ss)]; | ||||
| 	ustr_tests[i] = t.join(""); | ||||
| } | ||||
| 
 | ||||
| var assert = require('assert'); | ||||
| function fix(str) { return parseInt(str, 16)|0; } | ||||
| if(btest) for(var j = 0; j != ntests; ++j) { | ||||
| 	assert.equal(z1(bstr_tests[j][0]), b1(bstr_tests[j][1])); | ||||
| 
 | ||||
| 	assert.equal(z1(bstr_tests[j][0]), z2(bstr_tests[j][0])); | ||||
| 	assert.equal(z1(bstr_tests[j][0]), fix(z3(bstr_tests[j][0]))); | ||||
| 	assert.equal(z1(bstr_tests[j][0]), fix(z4(bstr_tests[j][0]))); | ||||
| 
 | ||||
| 	assert.equal(b1(bstr_tests[j][1]), b2(bstr_tests[j][1])); | ||||
| 	assert.equal(b1(bstr_tests[j][1]), fix(b3(bstr_tests[j][1]))); | ||||
| 	assert.equal(b1(bstr_tests[j][1]), fix(b4(bstr_tests[j][1]))); | ||||
| } | ||||
| if(utest) for(var j = 0; j != ntests; ++j) { | ||||
| 	assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j])); | ||||
| } | ||||
| 
 | ||||
| var BM = require('../perf/bm'); | ||||
| var suite = new BM('binary string (' + len_max + ')'); | ||||
| suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) z1(bstr_tests[j][0]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) z2(bstr_tests[j][0]); }); | ||||
| if(len_max < 4096) { | ||||
| 	suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) z3(bstr_tests[j][0]); }); | ||||
| 	suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) z4(bstr_tests[j][0]); }); | ||||
| } | ||||
| suite.run(); | ||||
| 
 | ||||
| suite = new BM('buffer (' + len_max + ')'); | ||||
| suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) b1(bstr_tests[j][1]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) b2(bstr_tests[j][1]); }); | ||||
| if(len_max < 1024) { | ||||
| 	suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) b3(bstr_tests[j][1]); }); | ||||
| 	suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) b4(bstr_tests[j][1]); }); | ||||
| } | ||||
| suite.run(); | ||||
| 
 | ||||
| var suite = new BM('unicode string (' + len_max + ')'); | ||||
| suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) u1(ustr_tests[j]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) u2(ustr_tests[j]); }); | ||||
| suite.run(); | ||||
| } | ||||
| crc32table = [ | ||||
| 	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, | ||||
| 	0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, | ||||
|  | ||||
							
								
								
									
										92
									
								
								misc/integration.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										92
									
								
								misc/integration.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,92 @@ | ||||
| if(typeof require !== 'undefined') { | ||||
| var js_crc32 = require('../'); | ||||
| var buffer_crc32 = require('./buffer-crc32'); | ||||
| var crc32 = require('./crc32'); | ||||
| var node_crc = require('./node-crc'); | ||||
| 
 | ||||
| function z1(bstr) { return js_crc32.bstr(bstr); } | ||||
| function z2(bstr) { return buffer_crc32.signed(bstr); } | ||||
| function z3(bstr) { return crc32(bstr); } | ||||
| function z4(bstr) { return node_crc.crc32(bstr);} | ||||
| 
 | ||||
| function b1(buf) { return js_crc32.buf(buf); } | ||||
| function b2(buf) { return buffer_crc32.signed(buf); } | ||||
| function b3(buf) { return crc32(buf); } | ||||
| function b4(buf) { return node_crc.crc32(buf); } | ||||
| 
 | ||||
| function u1(str) { return js_crc32.str(str); } | ||||
| function u2(str) { return buffer_crc32.signed(str); } | ||||
| 
 | ||||
| var ntests, len_max; | ||||
| switch(process.env.MODE) { | ||||
| 	case "A": ntests = 100000; len_max = 256; break; | ||||
| 	case "B": ntests = 10000; len_max = 1024; break; | ||||
| 	case "C": ntests = 10000; len_max = 4096; break; | ||||
| 	case "D": ntests = 1000; len_max = 16384; break; | ||||
| 	case "E": ntests = 1000; len_max = 65536; break; | ||||
| 	case "F": ntests = 100; len_max = 262144; break; | ||||
| 	default:  ntests = 10000; len_max = 1024; break; | ||||
| } | ||||
| 
 | ||||
| var btest = true, utest = true; | ||||
| 
 | ||||
| var bstr_tests = []; | ||||
| var ustr_tests = []; | ||||
| var len_min = 1; | ||||
| 
 | ||||
| var corpus = new Array(0x0800); | ||||
| for(var k = 0; k < 0x0800; ++k) corpus[k] = String.fromCharCode(k) | ||||
| len_max --; | ||||
| 
 | ||||
| k = (Math.random()*0x800)|0; | ||||
| for(var i = 0; i < ntests; ++i) { | ||||
| 	var l = (Math.random() * (len_max - len_min))|0 + len_min; | ||||
| 	var s = new Array(l), t = new Array(l); | ||||
| 	if(btest) for(var j = 0; j < l; ++j) s[j] = corpus[(i+j+k)&127]; | ||||
| 	if(utest) for(var j = 0; j < l; ++j) t[j] = corpus[(i+j+k)&0x7FF]; | ||||
| 	var ss = s.join(""); | ||||
| 	bstr_tests[i] = [ss, new Buffer(ss)]; | ||||
| 	ustr_tests[i] = t.join(""); | ||||
| } | ||||
| 
 | ||||
| var assert = require('assert'); | ||||
| function fix(str) { return parseInt(str, 16)|0; } | ||||
| if(btest) for(var j = 0; j != ntests; ++j) { | ||||
| 	assert.equal(z1(bstr_tests[j][0]), b1(bstr_tests[j][1])); | ||||
| 
 | ||||
| 	assert.equal(z1(bstr_tests[j][0]), z2(bstr_tests[j][0])); | ||||
| 	assert.equal(z1(bstr_tests[j][0]), fix(z3(bstr_tests[j][0]))); | ||||
| 	assert.equal(z1(bstr_tests[j][0]), fix(z4(bstr_tests[j][0]))); | ||||
| 
 | ||||
| 	assert.equal(b1(bstr_tests[j][1]), b2(bstr_tests[j][1])); | ||||
| 	assert.equal(b1(bstr_tests[j][1]), fix(b3(bstr_tests[j][1]))); | ||||
| 	assert.equal(b1(bstr_tests[j][1]), fix(b4(bstr_tests[j][1]))); | ||||
| } | ||||
| if(utest) for(var j = 0; j != ntests; ++j) { | ||||
| 	assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j])); | ||||
| } | ||||
| 
 | ||||
| var BM = require('../perf/bm'); | ||||
| var suite = new BM('binary string (' + len_max + ')'); | ||||
| suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) z1(bstr_tests[j][0]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) z2(bstr_tests[j][0]); }); | ||||
| if(len_max < 4096) { | ||||
| 	suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) z3(bstr_tests[j][0]); }); | ||||
| 	suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) z4(bstr_tests[j][0]); }); | ||||
| } | ||||
| suite.run(); | ||||
| 
 | ||||
| suite = new BM('buffer (' + len_max + ')'); | ||||
| suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) b1(bstr_tests[j][1]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) b2(bstr_tests[j][1]); }); | ||||
| if(len_max < 1024) { | ||||
| 	suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) b3(bstr_tests[j][1]); }); | ||||
| 	suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) b4(bstr_tests[j][1]); }); | ||||
| } | ||||
| suite.run(); | ||||
| 
 | ||||
| var suite = new BM('unicode string (' + len_max + ')'); | ||||
| suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) u1(ustr_tests[j]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) u2(ustr_tests[j]); }); | ||||
| suite.run(); | ||||
| } | ||||
							
								
								
									
										18
									
								
								misc/perf.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								misc/perf.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,18 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| cd misc &>/dev/null | ||||
| 
 | ||||
| git_module() { | ||||
| 	if [ ! -e "$1/" ]; then git clone $2; fi | ||||
| 	cd "$1" | ||||
| 	git pull | ||||
| 	cd - &>/dev/null | ||||
| } | ||||
| 
 | ||||
| echo "::: downloading modules" | ||||
| git_module node-crc https://github.com/alexgorbatchev/node-crc 2>/dev/null # crc | ||||
| git_module crc32 https://github.com/beatgammit/crc32 2>/dev/null # crc32 | ||||
| git_module buffer-crc32 https://github.com/brianloveswords/buffer-crc32 2>/dev/null # buffer-crc32 | ||||
| 
 | ||||
| for i in A B C D E F; do MODE="$i" node integration.js; done | ||||
| # for i in E F; do MODE="$i" node integration.js; done | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "crc-32", | ||||
| 	"version": "0.1.0", | ||||
| 	"version": "0.2.0", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "Pure-JS CRC-32", | ||||
| 	"keywords": [ "crc32", "checksum", "crc" ], | ||||
|  | ||||
							
								
								
									
										82
									
								
								perf.txt
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										82
									
								
								perf.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| --- binary string (255) --- | ||||
| ✓ js-crc32     x 25.41 ops/sec ±0.40% (45 runs sampled) | ||||
| ✓ buffer-crc32 x 6.63 ops/sec ±1.09% (20 runs sampled) | ||||
| ✓ crc32        x 0.84 ops/sec ±1.17% (6 runs sampled) | ||||
| ✓ node_crc     x 1.99 ops/sec ±0.59% (8 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- buffer (255) --- | ||||
| ✓ js-crc32     x 30.68 ops/sec ±0.40% (55 runs sampled) | ||||
| ✓ buffer-crc32 x 26.15 ops/sec ±0.36% (47 runs sampled) | ||||
| ✓ crc32        x 7.58 ops/sec ±0.61% (22 runs sampled) | ||||
| ✓ node_crc     x 3.51 ops/sec ±0.56% (12 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- unicode string (255) --- | ||||
| ✓ js-crc32     x 11.65 ops/sec ±0.35% (32 runs sampled) | ||||
| ✓ buffer-crc32 x 3.17 ops/sec ±4.01% (12 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- binary string (1023) --- | ||||
| ✓ js-crc32     x 65.10 ops/sec ±0.36% (68 runs sampled) | ||||
| ✓ buffer-crc32 x 25.63 ops/sec ±3.38% (60 runs sampled) | ||||
| ✓ crc32        x 2.52 ops/sec ±0.65% (10 runs sampled) | ||||
| ✓ node_crc     x 9.41 ops/sec ±0.55% (27 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- buffer (1023) --- | ||||
| ✓ js-crc32     x 78.58 ops/sec ±0.42% (82 runs sampled) | ||||
| ✓ buffer-crc32 x 73.15 ops/sec ±0.41% (76 runs sampled) | ||||
| ✓ crc32        x 21.28 ops/sec ±0.37% (39 runs sampled) | ||||
| ✓ node_crc     x 12.46 ops/sec ±0.42% (34 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- unicode string (1023) --- | ||||
| ✓ js-crc32     x 29.07 ops/sec ±0.51% (51 runs sampled) | ||||
| ✓ buffer-crc32 x 9.25 ops/sec ±6.61% (35 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- binary string (4095) --- | ||||
| ✓ js-crc32     x 16.57 ops/sec ±0.47% (44 runs sampled) | ||||
| ✓ buffer-crc32 x 13.30 ops/sec ±8.05% (34 runs sampled) | ||||
| ✓ crc32        x 0.60 ops/sec ±0.46% (5 runs sampled) | ||||
| ✓ node_crc     x 3.01 ops/sec ±0.52% (11 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- buffer (4095) --- | ||||
| ✓ js-crc32     x 20.35 ops/sec ±0.45% (37 runs sampled) | ||||
| ✓ buffer-crc32 x 18.86 ops/sec ±0.45% (50 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- unicode string (4095) --- | ||||
| ✓ js-crc32     x 7.20 ops/sec ±0.96% (22 runs sampled) | ||||
| ✓ buffer-crc32 x 4.20 ops/sec ±5.73% (13 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- binary string (16383) --- | ||||
| ✓ js-crc32     x 41.40 ops/sec ±0.15% (55 runs sampled) | ||||
| ✓ buffer-crc32 x 39.18 ops/sec ±5.86% (63 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- buffer (16383) --- | ||||
| ✓ js-crc32     x 51.36 ops/sec ±0.34% (67 runs sampled) | ||||
| ✓ buffer-crc32 x 47.72 ops/sec ±0.31% (63 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- unicode string (16383) --- | ||||
| ✓ js-crc32     x 18.47 ops/sec ±0.74% (49 runs sampled) | ||||
| ✓ buffer-crc32 x 11.29 ops/sec ±3.94% (31 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- binary string (65535) --- | ||||
| ✓ js-crc32     x 10.14 ops/sec ±4.43% (28 runs sampled) | ||||
| ✓ buffer-crc32 x 7.29 ops/sec ±5.49% (27 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- buffer (65535) --- | ||||
| ✓ js-crc32     x 12.34 ops/sec ±0.26% (34 runs sampled) | ||||
| ✓ buffer-crc32 x 11.29 ops/sec ±0.56% (32 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- unicode string (65535) --- | ||||
| ✓ js-crc32     x 4.28 ops/sec ±1.17% (14 runs sampled) | ||||
| ✓ buffer-crc32 x 2.73 ops/sec ±3.73% (10 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- binary string (262143) --- | ||||
| ✓ js-crc32     x 21.41 ops/sec ±3.43% (43 runs sampled) | ||||
| ✓ buffer-crc32 x 23.56 ops/sec ±4.02% (41 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- buffer (262143) --- | ||||
| ✓ js-crc32     x 31.51 ops/sec ±0.49% (55 runs sampled) | ||||
| ✓ buffer-crc32 x 27.56 ops/sec ±0.60% (51 runs sampled) | ||||
| Fastest is js-crc32 | ||||
| --- unicode string (262143) --- | ||||
| ✓ js-crc32     x 11.00 ops/sec ±0.98% (31 runs sampled) | ||||
| ✓ buffer-crc32 x 6.70 ops/sec ±2.99% (19 runs sampled) | ||||
| Fastest is js-crc32 | ||||
							
								
								
									
										15
									
								
								perf/bm.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								perf/bm.js
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | ||||
| /* ssf.js (C) 2014 SheetJS -- http://sheetjs.com */ | ||||
| /* bm.js (C) 2014 SheetJS -- http://sheetjs.com */ | ||||
| var Benchmark = require('benchmark'); | ||||
| var c = require('ansi')(process.stdout); | ||||
| 
 | ||||
| @ -12,17 +12,24 @@ function BM(name) { | ||||
| 	if(!(this instanceof BM)) return new BM(name); | ||||
| 	console.log("--- " + name + " ---"); | ||||
| 	this.suite = new Benchmark.Suite(name, { onComplete: suite_end }); | ||||
| 	this.suites = []; | ||||
| 	this.maxlen = 0; | ||||
| } | ||||
| 
 | ||||
| BM.prototype.run = function() { this.suite.run(); }; | ||||
| BM.prototype.run = function() { | ||||
| 	var maxlen = this.maxlen, ss = this.suite; | ||||
| 	this.suites.forEach(function(s) { ss.add(s[0] + new Array(maxlen-s[0].length+1).join(" "), s[1]); }); | ||||
| 	if(this.suites.length > 0) this.suite.run(); | ||||
| }; | ||||
| 
 | ||||
| BM.prototype.add = function(msg, test) { | ||||
| 	this.suite.add(msg, { | ||||
| 	this.suites.push([msg, { | ||||
| 		onCycle: test_cycle,  | ||||
| 		onComplete: test_end, | ||||
| 		defer: false,  | ||||
| 		fn: test | ||||
| 	}); | ||||
| 	}]); | ||||
| 	this.maxlen = Math.max(this.maxlen, msg.length); | ||||
| }; | ||||
| 
 | ||||
| module.exports = BM; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user