blob: b0238a3d8aeeedd3112ae44a4c318f78dba02647 [file] [edit]
function bench(string, func)
{
for (var i = 0; i < 1000; ++i)
func();
}
noInline(bench);
function forRepeatCount(count, pos, utf16) {
var base = "lalalalala".repeat(count);
if (utf16) {
base += "ϧ"; // arbitrary utf-16
}
var input = base;
var label;
const charToFind = !utf16 ? "z" : String.fromCodePoint(0x0245);
switch (pos) {
case -1: {
input = charToFind + base;
label = `beg ${utf16 ? "UChar" : "LChar"}`;
break;
}
case 0: {
label = `mid ${utf16 ? "UChar" : "LChar"}`;
input =
base.substring(0, (base.length / 2) | 0) +
charToFind +
base.substring((base.length / 2) | 0);
break;
}
case 1: {
label = `end ${utf16 ? "UChar" : "LChar"}`;
input = base + charToFind;
break;
}
// not found
case 2: {
label = `404 ${utf16 ? "UChar" : "LChar"}`;
break;
}
}
// force it to not be a rope
input = input.split("").join("");
function target() {
input.indexOf(charToFind)
}
noInline(target);
return bench(
`<${label}> [${new Intl.NumberFormat()
.format(input.length)
.padStart("10,000,001".length)} chars] indexOf`,
target
);
}
function all(utf16) {
forRepeatCount(1000, 0, !!utf16);
}
all(true);