-2
我目前正在測試多個解析行的情況。與V8的性能比較
每一行的格式類似:
"dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF"
有很多,當然行,我需要提取關鍵和值。
的鍵由第一「=」發現分隔。 密鑰中永遠不會有「=」字符。
值是緊接在第一個「=」符號後面的字符串的其餘部分。
因此,對於本例的結果應該是:
{
key: "dHdX5jOa7ww9cGsW7jQF",
value: "dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF"
}
從這裏我們可以對多種方案進行迭代:
// the first one is not very efficient with split splice join method
function first(line) {
const lineSplit = line.split('='),
key = lineSplit[0],
value = lineSplit.splice(1, lineSplit.length).join('=');
return {
key,
value
};
}
// the second one execute only what i want to do
// with built-in String prototype's functions
function optimized(line) {
const index = line.indexOf("="),
key = line.substr(0, index),
value = line.substr(index + 1, line.length);
return {
key,
value
};
}
// i tried to code the logic myself
function homemade(line) {
const len = line.length;
let value = "", key = "", valued = false;
for (let i = 0; i < len; ++i) {
const char = line[i];
if (valued === false) {
if (char !== '=') {
key += char;
} else {
valued = true;
}
} else {
value += char;
}
}
return {
key,
value
};
}
// and next recode substr and foreach built-in to implemant the same
// function but with homemade substr&foreach
String.prototype.substr2 = function(from, to){
let str = "";
for (let i = from; i < to; ++i) {
str += this[i];
}
return str;
};
String.prototype.indexOf2 = function(occ){
const len = this.length;
for (let i = 0; i < len; ++i) {
if (this[i] === occ) {
return i;
}
}
return -1;
};
function overload(line) {
const index = line.indexOf2("="),
key = line.substr2(0, index),
value = line.substr2(index + 1, line.length);
return {
key,
value
};
}
,瞧與jsBench結果:
[我m使用谷歌瀏覽器版本59.0.3071.104(官方版本)(64位)]
你可以用你的瀏覽器in this jsBench
我不明白是怎麼回事檢出這些功能的結果。我想象着不能可能的,因爲我只是寫我需要與本地的()和其他東西這樣的代碼...
我的問題是:
爲什麼內置的字符串操作顯然要快得多?
爲什麼這個重複的字符串串聯是不合適的?
是否有替代方案?
張貼,你的代碼有語法錯誤。這些'return'語句應該是'return {[key]:value};'發佈的JSBench頁面不適用於我;他們稱之爲'NaN'。 – Pointy
目前還不清楚你的具體問題是什麼。你覺得有什麼實現應該有很大的不同? – pvg
那麼,內建的字符串操作顯然比那些手工製作的低效的重複字符串連接要快得多。 – Bergi