考慮以下代碼片段:
function split() {
let time = 0;
let result = [];
for (let i = 0; i < 10 * 1000 * 1000; i ) {
let start = performance.now();
let words = "foo bar baz".split(" ");
let end = performance.now();
time = (end - start);
// result.push(words);
}
console.log(`Time needed: ${time}ms`);
}
此代碼的輸出類似于:
Time needed: 2664ms.
但是,如果該行未// result.push(words);注釋,則輸出類似于:
Time needed: 4991ms.
那是大約。慢 2 倍(請注意,我只測量 所需的時間split(),而不是push())。有人可以解釋我為什么嗎?
uj5u.com熱心網友回復:
performance.now() 沒有必要的準確性來衡量您要衡量的內容。瀏覽器故意從 performance.now() 回傳一個不準確的數字,以對抗像spectre這樣的漏洞。因此,在這兩種情況下,您看到的數字都不準確。
至于為什么你會得到不同的不準確數字,這是我的猜測。我猜大部分時間end - start是 0,因為兩個時間戳都舍入到相同的值。所以你真正計算的是時間戳從一個數字翻轉到下一個數字的次數。您的第一個代碼可能會回圈運行 10 次,其中 9 個報告 0ms,其中 1 個報告 1ms。但是,當你讓整個事情花費更長的時間時,現在只需要通過回圈 5 次就足夠的時間過去,舍入到另一個方向。因此,在回圈的 10 次中,8 次報告 0 毫秒,2 次報告 1 毫秒。
uj5u.com熱心網友回復:
您在一個回圈中花費了 10.000.000 次,總和為 2665 毫秒。如果“計算”一次回圈迭代的長度,則為 0.0002665 毫秒,即約 0.27 微秒。這遠低于 的準確度performance.now,根據檔案,準確度是 5 微秒(即 20 倍以上)。因此,您所測量的或多或少是隨機的......
并且僅出于演示目的(是的,測量仍然不準確):將兩種變體進行 1000 次并總結每次運行的持續時間將大致相同,因為不準確性會相互抵消。順便說一句,我運行了這個測驗 4 次,并且 3 次, split2() 是“更快”......
function split1() {
let time = 0;
let result = [];
for (let i = 0; i < 10 * 1000; i ) {
let start = performance.now();
let words = "foo bar baz".split(" ");
let end = performance.now();
time = (end - start);
//result.push(words);
}
return time;
}
function split2() {
let time = 0;
let result = [];
for (let i = 0; i < 10 * 1000; i ) {
let start = performance.now();
let words = "foo bar baz".split(" ");
let end = performance.now();
time = (end - start);
result.push(words);
}
return time;
}
let total1 = 0;
for (let i = 0; i< 1000; i )
total1 = split1();
let total2 = 0;
for (let i = 0; i< 1000; i )
total2 = split2();
console.log(total1.toFixed(1), total2.toFixed(1));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404902.html
標籤:
