亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

foo(123) 和窗口 [“foo”](123) 之間是否存在性能差異?

foo(123) 和窗口 [“foo”](123) 之間是否存在性能差異?

慕斯709654 2022-09-29 17:40:42
我想知道在 和 之間調用函數時是否有任何性能差異。foo()foo(123)window["foo"](123)
查看完整描述

4 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

好吧,10個循環乘以1億次操作給出了這個(鉻):

http://img1.sycdn.imooc.com//633568490001c0c903710219.jpg

您可以注意到,在第2行,它進行了一些優化并開始更快地運行。其他差異可以忽略不計。


for( let j = 0; j < 10; j++ ) {  

  let start1 = performance.now();

  let x1 = 0;

  for( let i = 0; i < 1e8; i++ ) {

    x1 += foo();

  }

  let end1 = ( performance.now() - start1 ).toFixed(10);

  

  /***/

  let start2 = performance.now();

  let x2 = 0;

  for( let i = 0; i < 1e8; i++ ) {

    x2 += window["foo"]();

  }

  let end2 = ( performance.now() - start2 ).toFixed(10);

  

  console.log("foo():", end1, " // window: ", end2);

}


/***/

function foo() {

  return 1;

}

.as-console-wrapper { max-height: 100vh !important; }


查看完整回答
反對 回復 2022-09-29
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

我真的希望沒有區別,但我看到測試的時間是2倍,或者這個簡單的加法測試:NO_WINDOWWINDOW_STRINGWINDOW_PROPERTY


add = (a,b) => a+b;


console.time('NO_WINDOW');


for (var i = 0; i < 1000; i++);

  add(i, i+1);

  

console.timeEnd('NO_WINDOW');



console.time('WINDOW_STRING');


for (var i = 0; i < 1000; i++);

  window['add'](i, i+1);

  

console.timeEnd('WINDOW_STRING');



console.time('WINDOW_PROPERTY');


for (var i = 0; i < 1000; i++);

  window.add(i, i+1);

  

console.timeEnd('WINDOW_PROPERTY');

編輯:Phil在評論中指出,這似乎是一個奇怪的問題,其中第一個調用總是比后續調用花費更長的時間。console.timeEnd


使用和適當的基準測試邏輯進行重現,在性能上沒有顯著的差異:performance.now()


add = (a,b) => a+b;

avg = (arr) => arr.reduce(add) / arr.length;


let noWindow = [],

    windowProp = [],

    windowString = [],

    n = 1e6,

    start;

  

  

start = performance.now();

for (var i = 0; i < n; i++)

  window.add(i, i+1);

windowProp.push(performance.now() - start);



start = performance.now();

    for (var i = 0; i < n; i++)

      add(i, i+1);

    noWindow.push(performance.now() - start);

    


start = performance.now();

for (var i = 0; i < n; i++)

  window['add'](i, i+1);

windowString.push(performance.now() - start);

  

  

let avgs = [

  avg(noWindow),

  avg(windowString),

  avg(windowProp)

];


console.log(avgs);


查看完整回答
反對 回復 2022-09-29
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

假設它們是等效的引用,似乎唯一的區別在于變量的讀取方式。眾所周知,在使用方括號讀取全局或對象屬性時,瀏覽器在歷史的不同時間點存在性能差異。

如果存在這樣的差異,那將是微不足道的,幾乎從來都不是問題。

我唯一想知道的是,某些瀏覽器是否會失去對動態訪問的鍵和/或全局變量的優化。它是一個全局函數,并且使用動態訪問該屬性的語法,該函數可能無法通過引擎進行完全優化。

同樣,可能不是你應該關心的事情,除非它是一個非常沉重的功能,并且通常運行起來相當昂貴。


查看完整回答
反對 回復 2022-09-29
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

根據你調用它的上下文,它是一回事。在瀏覽器中,基本上您可以訪問窗口對象中的任何鍵,而無需直接引用它。因此,這些中的任何一個都是相同的:


foo(123)

window["foo"](123)

window.foo(123)

在此處閱讀有關窗口對象和全局函數的更多信息。


查看完整回答
反對 回復 2022-09-29
  • 4 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號