2017-06-25 141 views
-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位)]

enter image description here

你可以用你的瀏覽器in this jsBench

我不明白是怎麼回事檢出這些功能的結果。我想象着不能可能的,因爲我只是寫我需要與本地的()和其他東西這樣的代碼...

我的問題是:

爲什麼內置的字符串操作顯然要快得多?

爲什麼這個重複的字符串串聯是不合適的?

是否有替代方案?

+0

張貼,你的代碼有語法錯誤。這些'return'語句應該是'return {[key]:value};'發佈的JSBench頁面不適用於我;他們稱之爲'NaN'。 – Pointy

+1

目前還不清楚你的具體問題是什麼。你覺得有什麼實現應該有很大的不同? – pvg

+1

那麼,內建的字符串操作顯然比那些手工製作的低效的重複字符串連接要快得多。 – Bergi

回答

1

爲什麼內置的字符串操作顯然要快得多?

因爲它們已經過優化,並且使用了JavaScript代碼無法使用的內部實現技巧。例如,他們通過一次構建結果避免重複字符串連接。

爲什麼這樣反覆字符串連接是無效的?

因爲它創造了很多的字符串作爲中間結果。

有沒有給它的選擇嗎?

使用內置的字符串操作:-)