gpt4 book ai didi

JavaScript - 人们可以期待什么级别的代码优化?

转载 作者:行者123 更新时间:2023-11-29 16:17:54 27 4
gpt4 key购买 nike

因此,我对 JavaScript 编码相当陌生,但总体上对编码并不陌生。在编写源代码时,我通常会考虑我的代码将在其中运行的环境(例如某种虚拟机)- 以及人们可以期望的代码优化级别。 (1)

以Java为例,我可能会这样写,

Foo foo = FooFactory.getFoo(Bar.someStaticStuff("qux","gak",42);
blub.doSomethingImportantWithAFooObject(foo);

即使 foo 对象仅在这个位置使用(因此引入了不必要的变量声明)。首先,我认为上面的代码比内联版本更易读

blub.doSomethingImportantWithAFooObject(FooFactory.getFoo(Bar.someStaticStuff("qux","gak",42));

其次,我知道 Java 编译器代码优化无论如何都会解决这个问题,即实际的 Java VM 代码最终会被内联 - 因此在性能方面,两者之间没有区别。 (2)

现在回答我的实际问题:
一般情况下,我可以期望 JavaScript 的代码优化达到什么水平?

我假设这取决于 JavaScript 引擎 - 但由于我的代码最终将在许多不同的浏览器中运行,所以我们只假设最坏的情况并查看最坏的情况。我可以期待适度的代码优化吗?哪些情况我仍然需要担心?


(1) 我确实意识到找到好的/最好的算法和编写组织良好的代码比代码优化更重要,对性能的影响也更大。但那将是一个不同的问题。

(2) 现在,我意识到没有优化的实际差异很小。但这不是重点。有一些很容易优化的功能非常有效,我只是有点懒得写下来。想象一下上面的代码片段在一个被调用 100'000 次的 for 循环中。

最佳答案

不要对优化抱太大期望,不会有

  • 尾递归优化,
  • 循环展开,
  • 内联函数

由于客户端上的 javascript 并非设计用于执行繁重的 CPU 工作,因此优化不会产生巨大差异。

有一些编写高性能 javascript 代码的指南,大多数都是次要的和技术性的,例如:

  • 不要使用eval()arguments.callee 等某些函数,这会阻止 js 引擎生成高性能代码。
  • 使用 native 功能而不是手写功能,例如不要编写自己的容器、json 解析器等。
  • 使用局部变量而不是全局变量。
  • 切勿对数组使用 for-each 循环。
  • 使用 parseInt() 而不是 Math.floor
  • 并远离 jQuery。

所有这些技术更像是经验的东西,背后可能有一些合理的解释。所以你将不得不花一些时间四处搜索或尝试jsPerf帮助您决定哪种方法更好。

发布代码时,使用closure compiler处理死分支和不必要的变量,这不会大大提高您的性能,但会使您的代码更小。

一般来说,最终性能在很大程度上取决于您的代码组织得如何,您的算法设计得有多仔细,而不是优化器的执行情况。


以你上面的例子为例(假设 FooFactory.getFoo()Bar.someStaticStuff("qux","gak",42) 总是返回相同的结果, 和 Bar, FooFactory 是无状态的,someStaticStuff()getFoo() 不会改变任何东西。 )

for (int i = 0; i < 10000000; i++)
blub.doSomethingImportantWithAFooObject(
FooFactory.getFoo(Bar.someStaticStuff("qux","gak",42));

即使是带有 -O3 标志的 g++ 也不能使该代码更快,因为编译器无法判断 BarFooFactory 是否是无状态的。因此,在任何语言中都应避免此类代码。

关于JavaScript - 人们可以期待什么级别的代码优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380390/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com