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

我想知道在 和 之间调用函数时是否有任何性能差异。foo()foo(123)window["foo"](123)



慕斯709654
浏览 150回答 4
4回答

Cats萌萌

好吧,10个循环乘以1亿次操作给出了这个(铬):您可以注意到,在第2行,它进行了一些优化并开始更快地运行。其他差异可以忽略不计。for( let j = 0; j < 10; j++ ) {&nbsp;&nbsp;&nbsp; let start1 = performance.now();&nbsp; let x1 = 0;&nbsp; for( let i = 0; i < 1e8; i++ ) {&nbsp; &nbsp; x1 += foo();&nbsp; }&nbsp; let end1 = ( performance.now() - start1 ).toFixed(10);&nbsp;&nbsp;&nbsp; /***/&nbsp; let start2 = performance.now();&nbsp; let x2 = 0;&nbsp; for( let i = 0; i < 1e8; i++ ) {&nbsp; &nbsp; x2 += window["foo"]();&nbsp; }&nbsp; let end2 = ( performance.now() - start2 ).toFixed(10);&nbsp;&nbsp;&nbsp; console.log("foo():", end1, " // window: ", end2);}/***/function foo() {&nbsp; return 1;}.as-console-wrapper { max-height: 100vh !important; }

狐的传说

我真的希望没有区别,但我看到测试的时间是2倍,或者这个简单的加法测试:NO_WINDOWWINDOW_STRINGWINDOW_PROPERTYadd = (a,b) => a+b;console.time('NO_WINDOW');for (var i = 0; i < 1000; i++);&nbsp; add(i, i+1);&nbsp;&nbsp;console.timeEnd('NO_WINDOW');console.time('WINDOW_STRING');for (var i = 0; i < 1000; i++);&nbsp; window['add'](i, i+1);&nbsp;&nbsp;console.timeEnd('WINDOW_STRING');console.time('WINDOW_PROPERTY');for (var i = 0; i < 1000; i++);&nbsp; window.add(i, i+1);&nbsp;&nbsp;console.timeEnd('WINDOW_PROPERTY');编辑:Phil在评论中指出,这似乎是一个奇怪的问题,其中第一个调用总是比后续调用花费更长的时间。console.timeEnd使用和适当的基准测试逻辑进行重现,在性能上没有显著的差异:performance.now()add = (a,b) => a+b;avg = (arr) => arr.reduce(add) / arr.length;let noWindow = [],&nbsp; &nbsp; windowProp = [],&nbsp; &nbsp; windowString = [],&nbsp; &nbsp; n = 1e6,&nbsp; &nbsp; start;&nbsp;&nbsp;&nbsp;&nbsp;start = performance.now();for (var i = 0; i < n; i++)&nbsp; window.add(i, i+1);windowProp.push(performance.now() - start);start = performance.now();&nbsp; &nbsp; for (var i = 0; i < n; i++)&nbsp; &nbsp; &nbsp; add(i, i+1);&nbsp; &nbsp; noWindow.push(performance.now() - start);&nbsp; &nbsp;&nbsp;start = performance.now();for (var i = 0; i < n; i++)&nbsp; window['add'](i, i+1);windowString.push(performance.now() - start);&nbsp;&nbsp;&nbsp;&nbsp;let avgs = [&nbsp; avg(noWindow),&nbsp; avg(windowString),&nbsp; avg(windowProp)];console.log(avgs);

qq_花开花谢_0

假设它们是等效的引用,似乎唯一的区别在于变量的读取方式。众所周知,在使用方括号读取全局或对象属性时,浏览器在历史的不同时间点存在性能差异。如果存在这样的差异,那将是微不足道的,几乎从来都不是问题。我唯一想知道的是,某些浏览器是否会失去对动态访问的键和/或全局变量的优化。它是一个全局函数,并且使用动态访问该属性的语法,该函数可能无法通过引擎进行完全优化。同样,可能不是你应该关心的事情,除非它是一个非常沉重的功能,并且通常运行起来相当昂贵。

阿晨1998

根据你调用它的上下文,它是一回事。在浏览器中,基本上您可以访问窗口对象中的任何键,而无需直接引用它。因此,这些中的任何一个都是相同的:foo(123)window["foo"](123)window.foo(123)在此处阅读有关窗口对象和全局函数的更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript