Optimize loops for V8 Smi
This commit is contained in:
parent
b40011c6f7
commit
00ae70e9dd
@ -36,7 +36,7 @@ function adler32_bstr(bstr/*:string*/, seed/*:?ADLER32Type*/)/*:ADLER32Type*/ {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += bstr.charCodeAt(i)&0xFF;
|
||||
b += a;
|
||||
@ -51,7 +51,7 @@ function adler32_buf(buf/*:ABuf*/, seed/*:?ADLER32Type*/)/*:ADLER32Type*/ {
|
||||
var a = 1, b = 0, L = buf.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += buf[i]&0xFF;
|
||||
b += a;
|
||||
@ -67,7 +67,7 @@ function adler32_str(str/*:string*/, seed/*:?ADLER32Type*/)/*:ADLER32Type*/ {
|
||||
var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850);
|
||||
M = Math.min(L-i, 2918);
|
||||
while(M>0) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) { a += c; }
|
||||
|
@ -28,7 +28,7 @@ function adler32_bstr(bstr, seed) {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += bstr.charCodeAt(i)&0xFF;
|
||||
b += a;
|
||||
@ -43,7 +43,7 @@ function adler32_buf(buf, seed) {
|
||||
var a = 1, b = 0, L = buf.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += buf[i]&0xFF;
|
||||
b += a;
|
||||
@ -58,7 +58,7 @@ function adler32_str(str, seed) {
|
||||
var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850);
|
||||
M = Math.min(L-i, 2918);
|
||||
while(M>0) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) { a += c; }
|
||||
|
@ -4,7 +4,7 @@ function adler32_bstr(bstr/*:string*/, seed/*:?ADLER32Type*/)/*:ADLER32Type*/ {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += bstr.charCodeAt(i)&0xFF;
|
||||
b += a;
|
||||
@ -19,7 +19,7 @@ function adler32_buf(buf/*:ABuf*/, seed/*:?ADLER32Type*/)/*:ADLER32Type*/ {
|
||||
var a = 1, b = 0, L = buf.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += buf[i]&0xFF;
|
||||
b += a;
|
||||
@ -35,7 +35,7 @@ function adler32_str(str/*:string*/, seed/*:?ADLER32Type*/)/*:ADLER32Type*/ {
|
||||
var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850);
|
||||
M = Math.min(L-i, 2918);
|
||||
while(M>0) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) { a += c; }
|
||||
|
@ -28,7 +28,7 @@ function adler32_bstr(bstr, seed) {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += bstr.charCodeAt(i)&0xFF;
|
||||
b += a;
|
||||
@ -43,7 +43,7 @@ function adler32_buf(buf, seed) {
|
||||
var a = 1, b = 0, L = buf.length, M = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += buf[i]&0xFF;
|
||||
b += a;
|
||||
@ -58,7 +58,7 @@ function adler32_str(str, seed) {
|
||||
var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0;
|
||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850);
|
||||
M = Math.min(L-i, 2918);
|
||||
while(M>0) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) { a += c; }
|
||||
|
18
perf/bstr.js
18
perf/bstr.js
@ -15,7 +15,7 @@ function sheetjs1(bstr) {
|
||||
function sheetjs2(bstr) {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
M = Math.min(L-i, 2654)+i;
|
||||
for(;i<M;i++) {
|
||||
a += bstr.charCodeAt(i);
|
||||
b += a;
|
||||
@ -27,6 +27,20 @@ function sheetjs2(bstr) {
|
||||
}
|
||||
|
||||
function sheetjs3(bstr) {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850)+i;
|
||||
for(;i<M;i++) {
|
||||
a += bstr.charCodeAt(i);
|
||||
b += a;
|
||||
}
|
||||
a = (15*(a>>>16)+(a&65535))
|
||||
b = (15*(b>>>16)+(b&65535))
|
||||
}
|
||||
return ((b%65521) << 16) | (a%65521);
|
||||
}
|
||||
|
||||
function sheetjs4(bstr) {
|
||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 5552);
|
||||
@ -58,11 +72,13 @@ for(var i = 6; i != 14; ++i) {
|
||||
assert.equal(res, sheetjs1(foobar));
|
||||
assert.equal(res, sheetjs2(foobar));
|
||||
assert.equal(res, sheetjs3(foobar));
|
||||
assert.equal(res, sheetjs4(foobar));
|
||||
|
||||
var suite = new BM('binary string (' + foobar.length + ')');
|
||||
if(i<3) suite.add('sheetjs 1', function() { for(var j = 0; j != m; ++j) sheetjs1(foobar); });
|
||||
suite.add('sheetjs 2', function() { for(var j = 0; j != m; ++j) sheetjs2(foobar); });
|
||||
suite.add('sheetjs 3', function() { for(var j = 0; j != m; ++j) sheetjs3(foobar); });
|
||||
suite.add('sheetjs 4', function() { for(var j = 0; j != m; ++j) sheetjs4(foobar); });
|
||||
suite.add('last vers', function() { for(var j = 0; j != m; ++j) old(foobar); });
|
||||
suite.add('current v', function() { for(var j = 0; j != m; ++j) cur(foobar); });
|
||||
suite.run();
|
||||
|
63
perf/utf8.js
63
perf/utf8.js
@ -17,6 +17,64 @@ function sheetjs1(utf8) {
|
||||
}
|
||||
|
||||
function sheetjs2(utf8) {
|
||||
var a = 1, b = 0, L = utf8.length, M, c, d;
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 2654);
|
||||
while(M>0) {
|
||||
c = utf8.charCodeAt(i++);
|
||||
if(c < 0x80) {
|
||||
a += c; b += a; --M;
|
||||
} else if(c < 0x800) {
|
||||
a += 192|((c>>6)&31); b += a; --M;
|
||||
a += 128|(c&63); b += a; --M;
|
||||
} else if(c >= 0xD800 && c < 0xE000) {
|
||||
c = (c&1023)+64; d = utf8.charCodeAt(i++) & 1023;
|
||||
a += 240|((c>>8)&7); b += a; --M;
|
||||
a += 128|((c>>2)&63); b += a; --M;
|
||||
a += 128|((d>>6)&15)|((c&3)<<4); b += a; --M;
|
||||
a += 128|(d&63); b += a; --M;
|
||||
} else {
|
||||
a += 224|((c>>12)&15); b += a; --M;
|
||||
a += 128|((c>>6)&63); b += a; --M;
|
||||
a += 128|(c&63); b += a; --M;
|
||||
}
|
||||
}
|
||||
a %= 65521;
|
||||
b %= 65521;
|
||||
}
|
||||
return (b << 16) | a;
|
||||
}
|
||||
|
||||
function sheetjs3(utf8) {
|
||||
var a = 1, b = 0, L = utf8.length, M, c, d;
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 2918);
|
||||
while(M>0) {
|
||||
c = utf8.charCodeAt(i++);
|
||||
if(c < 0x80) {
|
||||
a += c; b += a; --M;
|
||||
} else if(c < 0x800) {
|
||||
a += 192|((c>>6)&31); b += a; --M;
|
||||
a += 128|(c&63); b += a; --M;
|
||||
} else if(c >= 0xD800 && c < 0xE000) {
|
||||
c = (c&1023)+64; d = utf8.charCodeAt(i++) & 1023;
|
||||
a += 240|((c>>8)&7); b += a; --M;
|
||||
a += 128|((c>>2)&63); b += a; --M;
|
||||
a += 128|((d>>6)&15)|((c&3)<<4); b += a; --M;
|
||||
a += 128|(d&63); b += a; --M;
|
||||
} else {
|
||||
a += 224|((c>>12)&15); b += a; --M;
|
||||
a += 128|((c>>6)&63); b += a; --M;
|
||||
a += 128|(c&63); b += a; --M;
|
||||
}
|
||||
}
|
||||
a %= 65521;
|
||||
b %= 65521;
|
||||
}
|
||||
return (b << 16) | a;
|
||||
}
|
||||
|
||||
function sheetjs4(utf8) {
|
||||
var a = 1, b = 0, L = utf8.length, M, c, d;
|
||||
for(var i = 0; i < L;) {
|
||||
M = Math.min(L-i, 3850);
|
||||
@ -53,11 +111,16 @@ var res = old(foobar);
|
||||
assert.equal(res, cur(foobar));
|
||||
assert.equal(res, sheetjs1(foobar));
|
||||
assert.equal(res, sheetjs2(foobar));
|
||||
assert.equal(res, sheetjs3(foobar));
|
||||
assert.equal(res, sheetjs4(foobar));
|
||||
|
||||
|
||||
var BM = require('./bm');
|
||||
var suite = new BM('unicode string');
|
||||
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('sheetjs 4', function() { for(var j = 0; j != 1000; ++j) sheetjs4(foobar); });
|
||||
suite.add('last vers', function() { for(var j = 0; j != 1000; ++j) old(foobar); });
|
||||
suite.add('current v', function() { for(var j = 0; j != 1000; ++j) cur(foobar); });
|
||||
suite.run();
|
||||
|
Loading…
Reference in New Issue
Block a user