为了账号安全,请及时绑定邮箱和手机立即绑定

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亿次操作给出了这个(铬):

//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 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号