Optimize loops for V8 Smi

This commit is contained in:
Arjun Barrett 2021-02-11 12:23:33 -08:00
parent b40011c6f7
commit 00ae70e9dd
6 changed files with 92 additions and 13 deletions

@ -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; }

@ -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();

@ -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();