version bump 0.2.1: 8-step unroll
This commit is contained in:
		
							parent
							
								
									c79a8fb6c9
								
							
						
					
					
						commit
						1a8f8f3626
					
				| @ -1 +1 @@ | ||||
| CRC32.version = '0.2.0'; | ||||
| CRC32.version = '0.2.1'; | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| var use_buffer = typeof Buffer !== 'undefined'; | ||||
| function crc32_bstr(bstr) { | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf(Buffer(bstr)); | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(Buffer(bstr)); | ||||
| 	var crc = -1, L = bstr.length - 1; | ||||
| 	for(var i = 0; i < L;) { | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| @ -12,18 +12,29 @@ function crc32_bstr(bstr) { | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	if(buf.length > 10000) return crc32_buf_8(buf); | ||||
| 	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) { | ||||
| 	while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf_8(buf) { | ||||
| 	for(var crc = -1, i = 0, L=buf.length-7; i < L;) { | ||||
| 		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]; }}} | ||||
| 		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]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	} | ||||
| 	while(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										25
									
								
								crc32.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										25
									
								
								crc32.js
									
									
									
									
									
								
							| @ -2,7 +2,7 @@ | ||||
| /* vim: set ts=2: */ | ||||
| var CRC32 = {}; | ||||
| (function(CRC32) { | ||||
| CRC32.version = '0.2.0'; | ||||
| CRC32.version = '0.2.1'; | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| @ -27,7 +27,7 @@ var table = signed_crc_table(); | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| var use_buffer = typeof Buffer !== 'undefined'; | ||||
| function crc32_bstr(bstr) { | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf(Buffer(bstr)); | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(Buffer(bstr)); | ||||
| 	var crc = -1, L = bstr.length - 1; | ||||
| 	for(var i = 0; i < L;) { | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| @ -38,18 +38,29 @@ function crc32_bstr(bstr) { | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	if(buf.length > 10000) return crc32_buf_8(buf); | ||||
| 	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) { | ||||
| 	while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf_8(buf) { | ||||
| 	for(var crc = -1, i = 0, L=buf.length-7; i < L;) { | ||||
| 		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]; }}} | ||||
| 		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]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	} | ||||
| 	while(i < L+7) 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.2.0'; | ||||
| CRC32.version = '0.2.1'; | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| @ -27,7 +27,7 @@ var table = signed_crc_table(); | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| var use_buffer = typeof Buffer !== 'undefined'; | ||||
| function crc32_bstr(bstr) { | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf(Buffer(bstr)); | ||||
| 	if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(Buffer(bstr)); | ||||
| 	var crc = -1, L = bstr.length - 1; | ||||
| 	for(var i = 0; i < L;) { | ||||
| 		crc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8); | ||||
| @ -38,18 +38,29 @@ function crc32_bstr(bstr) { | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	if(buf.length > 10000) return crc32_buf_8(buf); | ||||
| 	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) { | ||||
| 	while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf_8(buf) { | ||||
| 	for(var crc = -1, i = 0, L=buf.length-7; i < L;) { | ||||
| 		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]; }}} | ||||
| 		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]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	} | ||||
| 	while(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -6,8 +6,10 @@ var bits = [ | ||||
| 	[ "foo bar baz٪☃🍣", 1531648243] | ||||
| ]; | ||||
| if(typeof module !== "undefined") module.exports = bits; | ||||
| /* vim: set ts=2: */ | ||||
| if(typeof require !== 'undefined') { | ||||
| var js_crc32 = require('../'); | ||||
| var js_crc32_old = require('crc-32'); | ||||
| var buffer_crc32 = require('./buffer-crc32'); | ||||
| var crc32 = require('./crc32'); | ||||
| var node_crc = require('./node-crc'); | ||||
| @ -16,16 +18,19 @@ 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 z5(bstr) { return js_crc32_old.bstr(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 b5(buf) { return js_crc32_old.buf(buf); } | ||||
| 
 | ||||
| function u1(str) { return js_crc32.str(str); } | ||||
| function u2(str) { return buffer_crc32.signed(str); } | ||||
| function u3(str) { return js_crc32_old.str(str); } | ||||
| 
 | ||||
| var ntests, len_max; | ||||
| var ntests, len_max, do_bstr, do_buf, do_ustr; | ||||
| switch(process.env.MODE) { | ||||
| 	case "A": ntests = 100000; len_max = 256; break; | ||||
| 	case "B": ntests = 10000; len_max = 1024; break; | ||||
| @ -36,7 +41,15 @@ switch(process.env.MODE) { | ||||
| 	default:  ntests = 10000; len_max = 1024; break; | ||||
| } | ||||
| 
 | ||||
| var btest = true, utest = true; | ||||
| if(process.argv === 2) do_bstr = do_buf = do_ustr = true; | ||||
| else { | ||||
| 	do_bstr = process.argv[2].indexOf("S") > -1; | ||||
| 	do_buf  = process.argv[2].indexOf("B") > -1; | ||||
| 	do_ustr = process.argv[2].indexOf("U") > -1; | ||||
| 	if(!do_bstr && !do_buf && !do_ustr) do_bstr = do_buf = do_ustr = true; | ||||
| } | ||||
| 
 | ||||
| var btest = !!do_bstr || !!do_buf, utest = !!do_ustr; | ||||
| 
 | ||||
| var bstr_tests = []; | ||||
| var ustr_tests = []; | ||||
| @ -60,44 +73,61 @@ for(var i = 0; i < ntests; ++i) { | ||||
| 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])); | ||||
| 	if(do_bstr && do_buf) 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]))); | ||||
| 	if(do_bstr) { | ||||
| 		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(z1(bstr_tests[j][0]), z5(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(do_buf) { | ||||
| 		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]))); | ||||
| 		assert.equal(b1(bstr_tests[j][1]), b5(bstr_tests[j][1])); | ||||
| 	} | ||||
| } | ||||
| if(utest) for(var j = 0; j != ntests; ++j) { | ||||
| 	assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j])); | ||||
| 	assert.equal(u1(ustr_tests[j]), u3(ustr_tests[j])); | ||||
| } | ||||
| 
 | ||||
| var BM = require('../perf/bm'); | ||||
| 
 | ||||
| if(do_bstr) { | ||||
| 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('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) z5(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(); | ||||
| } | ||||
| 
 | ||||
| if(do_buf) { | ||||
| 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('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) b5(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(); | ||||
| } | ||||
| 
 | ||||
| if(do_ustr) { | ||||
| 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('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) u3(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, | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| /* vim: set ts=2: */ | ||||
| if(typeof require !== 'undefined') { | ||||
| var js_crc32 = require('../'); | ||||
| var js_crc32_old = require('crc-32'); | ||||
| var buffer_crc32 = require('./buffer-crc32'); | ||||
| var crc32 = require('./crc32'); | ||||
| var node_crc = require('./node-crc'); | ||||
| @ -8,16 +10,19 @@ 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 z5(bstr) { return js_crc32_old.bstr(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 b5(buf) { return js_crc32_old.buf(buf); } | ||||
| 
 | ||||
| function u1(str) { return js_crc32.str(str); } | ||||
| function u2(str) { return buffer_crc32.signed(str); } | ||||
| function u3(str) { return js_crc32_old.str(str); } | ||||
| 
 | ||||
| var ntests, len_max; | ||||
| var ntests, len_max, do_bstr, do_buf, do_ustr; | ||||
| switch(process.env.MODE) { | ||||
| 	case "A": ntests = 100000; len_max = 256; break; | ||||
| 	case "B": ntests = 10000; len_max = 1024; break; | ||||
| @ -28,7 +33,15 @@ switch(process.env.MODE) { | ||||
| 	default:  ntests = 10000; len_max = 1024; break; | ||||
| } | ||||
| 
 | ||||
| var btest = true, utest = true; | ||||
| if(process.argv === 2) do_bstr = do_buf = do_ustr = true; | ||||
| else { | ||||
| 	do_bstr = process.argv[2].indexOf("S") > -1; | ||||
| 	do_buf  = process.argv[2].indexOf("B") > -1; | ||||
| 	do_ustr = process.argv[2].indexOf("U") > -1; | ||||
| 	if(!do_bstr && !do_buf && !do_ustr) do_bstr = do_buf = do_ustr = true; | ||||
| } | ||||
| 
 | ||||
| var btest = !!do_bstr || !!do_buf, utest = !!do_ustr; | ||||
| 
 | ||||
| var bstr_tests = []; | ||||
| var ustr_tests = []; | ||||
| @ -52,41 +65,58 @@ for(var i = 0; i < ntests; ++i) { | ||||
| 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])); | ||||
| 	if(do_bstr && do_buf) 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]))); | ||||
| 	if(do_bstr) { | ||||
| 		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(z1(bstr_tests[j][0]), z5(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(do_buf) { | ||||
| 		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]))); | ||||
| 		assert.equal(b1(bstr_tests[j][1]), b5(bstr_tests[j][1])); | ||||
| 	} | ||||
| } | ||||
| if(utest) for(var j = 0; j != ntests; ++j) { | ||||
| 	assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j])); | ||||
| 	assert.equal(u1(ustr_tests[j]), u3(ustr_tests[j])); | ||||
| } | ||||
| 
 | ||||
| var BM = require('../perf/bm'); | ||||
| 
 | ||||
| if(do_bstr) { | ||||
| 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('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) z5(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(); | ||||
| } | ||||
| 
 | ||||
| if(do_buf) { | ||||
| 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('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) b5(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(); | ||||
| } | ||||
| 
 | ||||
| if(do_ustr) { | ||||
| 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('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) u3(ustr_tests[j]); }); | ||||
| suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) u2(ustr_tests[j]); }); | ||||
| suite.run(); | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -10,9 +10,9 @@ git_module() { | ||||
| } | ||||
| 
 | ||||
| echo "::: downloading modules" | ||||
| npm install crc-32 2>/dev/null | ||||
| 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 | ||||
| for i in A B C D E F; do MODE="$i" node integration.js "$1"; done | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "crc-32", | ||||
| 	"version": "0.2.0", | ||||
| 	"version": "0.2.1", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "Pure-JS CRC-32", | ||||
| 	"keywords": [ "crc32", "checksum", "crc" ], | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| var Benchmark = require('benchmark'); | ||||
| var c = require('ansi')(process.stdout); | ||||
| 
 | ||||
| function test_end() { c.horizontalAbsolute(0).write("✓"); c.write('\n'); } | ||||
| function test_end(e) { c.horizontalAbsolute(0).write("✓ "+e.target); c.write('\n'); } | ||||
| 
 | ||||
| function suite_end() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }  | ||||
| 
 | ||||
| @ -16,7 +16,8 @@ function BM(name) { | ||||
| 	this.maxlen = 0; | ||||
| } | ||||
| 
 | ||||
| BM.prototype.run = function() { | ||||
| BM.prototype.run = function(skip) { | ||||
| 	if(skip) { this.suites.forEach(function(s) { s[1].fn(); }); return; } | ||||
| 	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(); | ||||
|  | ||||
							
								
								
									
										106
									
								
								perf/bstr.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										106
									
								
								perf/bstr.js
									
									
									
									
									
								
							| @ -7,77 +7,97 @@ function strToArr(str) { | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| 	function crcTable(arr, append) { | ||||
| 		var crc, i, l; | ||||
| function crcTable(arr, append) { | ||||
| 	var crc, i, l; | ||||
| 
 | ||||
| 		// if we're in append mode, don't reset crc
 | ||||
| 		// if arr is null or undefined, reset table and return
 | ||||
| 		if (typeof crcTable.crc === 'undefined' || !append || !arr) { | ||||
| 			crcTable.crc = 0 ^ -1; | ||||
| 	// if we're in append mode, don't reset crc
 | ||||
| 	// if arr is null or undefined, reset table and return
 | ||||
| 	if (typeof crcTable.crc === 'undefined' || !append || !arr) { | ||||
| 		crcTable.crc = 0 ^ -1; | ||||
| 
 | ||||
| 			if (!arr) { | ||||
| 				return; | ||||
| 			} | ||||
| 		if (!arr) { | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		// store in temp variable for minor speed gain
 | ||||
| 		crc = crcTable.crc; | ||||
| 
 | ||||
| 		for (i = 0, l = arr.length; i < l; i += 1) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ arr[i]) & 0xff]; | ||||
| 		} | ||||
| 
 | ||||
| 		crcTable.crc = crc; | ||||
| 
 | ||||
| 		return crc ^ -1; | ||||
| 	} | ||||
| 
 | ||||
| 	// store in temp variable for minor speed gain
 | ||||
| 	crc = crcTable.crc; | ||||
| 
 | ||||
| 	for (i = 0, l = arr.length; i < l; i += 1) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ arr[i]) & 0xff]; | ||||
| 	} | ||||
| 
 | ||||
| 	crcTable.crc = crc; | ||||
| 
 | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function node_crc32(bstr) { | ||||
| 	return crcTable(strToArr(bstr)); | ||||
| } | ||||
| 
 | ||||
| function sheetjs1(bstr) {  | ||||
| 	for(var crc = -1, i = 0; i != bstr.length; ++i) { | ||||
| function sheetjs1(bstr) { | ||||
| 	for(var crc = -1, i = 0; i < bstr.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF]; | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function sheetjs2(bstr) {  | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| function sheetjs2(bstr) { | ||||
| 	var L = bstr.length - 1; | ||||
| 	for(var crc = -1, i = 0; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(i === bstr.length - 1) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function sheetjs3(bstr) {  | ||||
| function sheetjs3(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-2; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L++) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(i === L++) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	while(i < L+2) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function sheetjs8(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-7; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	while(i < L+7) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| var w = 2000; | ||||
| var base = new Array(w); | ||||
| for(var i = 0; i !== w; ++i) base[i] = String.fromCharCode((Math.random()*256)&255); | ||||
| var b = new Array(w); | ||||
| for(var i = 0; i !== w; ++i) b[i] = ""+base.slice(0,i).join(""); | ||||
| 
 | ||||
| var assert = require('assert'); | ||||
| for(var i = 0; i !== w; ++i) { | ||||
| 	var foobar = b[i]; | ||||
| 	assert.equal(node_crc32(foobar), sheetjs1(foobar)); | ||||
| 	assert.equal(node_crc32(foobar), sheetjs2(foobar)); | ||||
| 	assert.equal(node_crc32(foobar), sheetjs3(foobar)); | ||||
| 	assert.equal(node_crc32(foobar), sheetjs8(foobar)); | ||||
| } | ||||
| 
 | ||||
| var BM = require('./bm'); | ||||
| var suite = new BM('binary string'); | ||||
| 
 | ||||
| var foobar = "foobarbazqux"; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| suite.add('npm crc32', function() { for(var j = 0; j != 1000; ++j) node_crc32(foobar); }); | ||||
| suite.add('sheetjs 1', function() { for(var j = 0; j != 1000; ++j) sheetjs1(foobar); }); | ||||
| suite.add('sheetjs 2', function() { for(var j = 0; j != 1000; ++j) sheetjs2(foobar); }); | ||||
| suite.add('sheetjs 3', function() { for(var j = 0; j != 1000; ++j) sheetjs3(foobar); }); | ||||
| suite.add('npm crc32', function() { for(var j = 0; j !== w; ++j) node_crc32(b[j]); }); | ||||
| suite.add('sheetjs 1', function() { for(var j = 0; j !== w; ++j) sheetjs1(b[j]); }); | ||||
| suite.add('sheetjs 2', function() { for(var j = 0; j !== w; ++j) sheetjs2(b[j]); }); | ||||
| suite.add('sheetjs 3', function() { for(var j = 0; j !== w; ++j) sheetjs3(b[j]); }); | ||||
| suite.add('sheetjs 8', function() { for(var j = 0; j !== w; ++j) sheetjs8(b[j]); }); | ||||
| suite.run(); | ||||
| 
 | ||||
| var assert = require('assert'); | ||||
| assert.equal(node_crc32(foobar), sheetjs1(foobar)); | ||||
| assert.equal(node_crc32(foobar), sheetjs2(foobar)); | ||||
| assert.equal(node_crc32(foobar), sheetjs3(foobar)); | ||||
|  | ||||
| @ -35,10 +35,7 @@ var BM = require('./bm'); | ||||
| var suite = new BM('unicode string'); | ||||
| 
 | ||||
| var foobar = "foo bar baz٪☃🍣"; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| for(var i = 0; i != 4; ++i) foobar += " " + foobar; | ||||
| suite.add('sheetjs 1', function() { for(var j = 0; j != 1000; ++j) sheetjs1(foobar); }); | ||||
| suite.add('sheetjs 2', function() { for(var j = 0; j != 1000; ++j) sheetjs2(foobar); }); | ||||
| suite.run() | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user