- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我对 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 引擎生成高性能代码。parseInt()
而不是 Math.floor
。所有这些技术更像是经验的东西,背后可能有一些合理的解释。所以你将不得不花一些时间四处搜索或尝试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++ 也不能使该代码更快,因为编译器无法判断 Bar
和 FooFactory
是否是无状态的。因此,在任何语言中都应避免此类代码。
关于JavaScript - 人们可以期待什么级别的代码优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380390/
我想在“交互”模式下“监听”shell 输出的字符串。或者我想以某种方式模拟交互模式,这仍然允许我从 shell 监听特定的字符串。 好像interact只听用户输入(我按下的键)而不是 shell
这些字符数组在语法上有什么问题? struct NewBuiltIn{ char *CommandName[64] = "bigbluetest"; char *FunctionNam
我正在尝试使用继承来创建一个从 runtime_error 派生的类,但我一直收到错误,即使这是练习中使用的确切代码并且作为书中的示例。这是代码: class DivideZeroEx : publi
您好,下面是我的 SQL 代码,它给了我错误,我不知道为什么。如果有人可以提供帮助。 select time_dif, count(time_dif) as count from ( select d
我想在构造函数中分配我的类变量,但出现错误“期望成员声明” class YLAService { var context:Context?=null class YLAService
试图让我了解 Jasmine spy ,这就是我的测试的样子: $scope.switchTurns = function () { $scope.playerTurn = !$scope
我正在研究一个 C 输出问题: #include int main() { int a[][2][3]={0,1,2,3,4,5,6,7,8,9,10,11,12}; int i=-1;
我正在为我的大学做一个关于编译器的作业,这是我第一次使用 SableCC 3.7。我正在尝试定义我的语法文件,但是当我尝试运行它(通过命令行)时,我收到此错误: “ParserException:[5
我正在尝试下面的线性回归 python 代码,但收到错误:“期望 2D 数组得到 1D 数组:Array=[16]”。可能出了什么问题? from sklearn.linear_model impo
这个问题在这里已经有了答案: MySQL - UPDATE query based on SELECT Query (13 个答案) 关闭 3 年前。 我尝试将 John Smith 的薪水增加 1
我在程序结束时遇到问题,它在关键字“END”的末尾表示语法错误,意外的 END_OF_INPUT,期待 IF - 最后一行。我看不出出了什么问题,有人知道问题出在哪里 DELIMITER $$
我为我的方法编写了一个 JUnit 测试。 这是我的方法: public static int delimit(int value, int min, int max) throws Illeg
我想制作一个可以使用 srand 函数回答问题的 expect 脚本。 例如,我将使用 netcat 连接到服务器,我将从服务器收到一个问题,例如“请输入 0 或 1”;然后我希望我的脚本可以使用上面
我有一个初始化脚本(我运行的是 Debian)来启动一个 DLNA 服务器。当我开始服务时,出现以下错误。任何帮助,将不胜感激。请注意:我对 linux/bash/debian 非常陌生。 我收到此错
我正在尝试创建一个脚本来清除 ciscoasa bad xlate。 为了检查错误的 xlate,我运行 sh xlate |在 500 中,如果它得到回复,那么它应该发送一个明确的命令。如果我不这样
我在使用 bash 变量执行 expect 命令时遇到问题。我有脚本参数给定的位置,我需要通过 expect -c 在发送命令中使用它。但我需要用 "给它,所以实际上发送命令认为我已经结束输入,并且在
我真的很难过!我不想使用 RSA AUTH,所以请弃权。 #!/bin/bash echo "Enter the server password" read password cd /home/mik
我有一个异步 QUnit 测试,如果操作超时,测试应该通过。 (我正在测试,如果您省略可选的 errorCallback 并执行会引发错误的操作,那么无论您等待多长时间,基本上都不会发生任何事情。)
关于这个话题有很多问题,但是 - 他们没有给我答案。 根据建议 - 有一个可以设置 ServicePointManager.Expect100Continue = false。但这是 Not Acce
有几篇关于相同内容的帖子,但我仍然无法使我的 expect 脚本正常工作。我的意图是将所有内容自动化,但为用户保留输入密码。所以脚本有 3 个部分: 自动登录 让用户输入密码 将控制权交还给 Expe
我是一名优秀的程序员,十分优秀!