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

Javascript foo(123)和window[“foo”](123)之间是否存在性能差异?,javascript,Javascript,我想知道在调用函数foo时,foo123和window[foo]123之间是否存在性能差异。根据调用它的上下文,这是相同的。在浏览器中,基本上可以访问窗口对象中的任何关键点,而无需直接引用它。所有这些都是一样的: foo(123) window["foo"](123) window.foo(123) 阅读有关窗口对象和全局函数的更多信息。我真的希望不会有什么不同,但我看到,对于这个简单的加法测试,无窗口的测试需要2倍的时间作为窗口字符串或窗口属性: 加=a,b=>a+b; 控制台。时间“没有

我想知道在调用函数foo时,foo123和window[foo]123之间是否存在性能差异。

根据调用它的上下文,这是相同的。在浏览器中,基本上可以访问窗口对象中的任何关键点,而无需直接引用它。所有这些都是一样的:

foo(123)
window["foo"](123)
window.foo(123)

阅读有关窗口对象和全局函数的更多信息。

我真的希望不会有什么不同,但我看到,对于这个简单的加法测试,无窗口的测试需要2倍的时间作为窗口字符串或窗口属性:

加=a,b=>a+b; 控制台。时间“没有窗口”; 对于var i=0;i<1000;i++; addi,i+1; 控制台。timeEnd“无窗口”; 控制台。时间“窗口字符串”; 对于var i=0;i<1000;i++; 窗口['add']i,i+1; 控制台.timeEnd'WINDOW_STRING'; 控制台。时间“窗口属性”; 对于var i=0;i<1000;i++; window.addi,i+1;
console.timeEnd'WINDOW_PROPERTY' 根据您使用它的方式,是或否。本质上,在程序中使用一次没有区别,但这取决于代码执行的位置、方式和次数。但是,您很少会寻找纯性能。

假设它们是等效的引用,看起来唯一的区别在于如何读取变量。众所周知,在使用方括号读取全局或对象属性时,浏览器在历史上的不同时间点上存在性能差异

如果存在这样的差异,那将是微不足道的,而且几乎从来都不是问题

我唯一想知道的是,一些浏览器是否丢失了对动态访问键和/或全局的优化。它是一个全局函数,并且使用动态访问属性的语法,有可能函数无法通过引擎得到完全优化


同样,除非它是一个非常繁重的功能,而且一般来说运行起来非常昂贵,否则可能不会引起您的注意。

好吧,10个循环加上1亿次操作,就产生了这个chrome:

您可以注意到,在第2行,它进行了一些优化,并开始运行得更快。其他差异可以忽略

对于设j=0;j<10;j++{ 让start1=performance.now; 设x1=0; 对于设i=0;i<1e8;i++{ x1+=foo; } 让end1=performance.now-start1.toFixed10; /***/ 让start2=performance.now; 设x2=0; 对于设i=0;i<1e8;i++{ x2+=窗口[foo]; } 让end2=performance.now-start2.toFixed10; console.logfoo:,end1,//window:,end2; } /***/ 函数foo{ 返回1; }
.作为控制台包装器{max height:100vh!important;}实际上:否,尽管根据上下文,不能保证它们是等效的。这在很大程度上取决于实现细节,无论哪种方式都可以进行理论论证。那么如何“发现”?基准测试!然后意识到这些微基准在实际代码中的意思是。。搜索“benchmark javascript online”以获取各种工具,使基准测试变得简单和可共享。foo123可能调用也可能不调用window[foo]这就是您要问的问题……在边缘情况下可能会有性能差异,这在实际场景中是不相关的。您不应该关心性能,如果它需要数十亿次运算才能找出差异,我还是没有找到。第一次在总体上确实不一样。。。你可能想澄清这一点。你运行这些的顺序似乎决定了一切。试着改变它们,你会发现第一个循环总是以longest@Phil这是一个很好的观察,非常有趣。让我们试试performance.now。我不确定它是否是正确的基准测试,因为在循环中调用benchmarkadd和其他函数时,您只复制了一次指向该函数的链接。。。这意味着调用fn的基准测试的内部循环似乎并不重要@OPTIMUSPRIME你是绝对正确的-我编辑了它,这是一个微不足道的区别=