【问题标题】:Javascript heavily executed functions: inline or declared?Javascript 大量执行函数:内联还是声明?
【发布时间】:2013-06-21 20:59:33
【问题描述】:

是否可以安全地假设对于时间要求严格的应用程序,使用函数声明或函数表达式总是比在大量执行的回调中使用内联函数更好?

考虑以下测试程序:

var x;
var count3 = function count3() {
    x++;
}

var count2 = function () {
    x++;
}

function count() {
    x++;
}

function execute(cb) {
    cb();
}

x = 0;
var a = new Date().getTime();
for (var i = 0; i < 100000000; i++) {
    execute(function named() {
        x++;
    })
}
a = new Date().getTime() - a;
console.log("Named inline function: " + a);
x = 0;
a = new Date().getTime();
for (var i = 0; i < 100000000; i++) {
    execute(function () {
        x++;
    })
}

a = new Date().getTime() - a;
console.log("Anonymous inline function: " + a);
x = 0;
a = new Date().getTime();
for (var i = 0; i < 100000000; i++) {
    execute(count);
}

a = new Date().getTime() - a;
console.log("Function declaration: " + a);
x = 0;
a = new Date().getTime();
for (var i = 0; i < 100000000; i++) {
    execute(count2);
}

a = new Date().getTime() - a;
console.log("Anonymous function expression:" + a);
x = 0;
a = new Date().getTime();
for (var i = 0; i < 100000000; i++) {
    execute(count3);
}

a = new Date().getTime() - a;
console.log("Named function expression:" + a);

这给出以下输出(以毫秒为单位):

Named inline function: 2347
Anonymous inline function: 2121
Function declaration: 771
Anonymous function expression:750
Named function expression:752

在我简陋的笔记本电脑上,函数声明和函数表达式比内联函数快 3 倍。

【问题讨论】:

  • 这是否可以概括?例如。总是尝试在大量执行的回调中使用函数声明而不是内联函数
  • 把你的代码放到jshint.com,是的,你不应该在循环中内联函数。
  • Stack Exchange Code Review上可能会得到更好的答案
  • @Ghillied:为什么?这是一个有效的问题,他并没有真正需要审查的代码。计时测试套件及其结果可能更适合答案,但它们没问题。
  • @SeppVanRompaey - 你为什么不使用jsPerfBenchmark.js

标签: javascript performance node.js optimization


【解决方案1】:

是的,这可以概括。从技术上讲,循环体中的函数表达式在每个循环轮次都被重新评估为一个新的函数对象。正如您的测试所证实的那样,这比在循环外定义一个“静态”函数要慢得多(对于数百万次迭代)。函数是否命名并不重要,在执行上下文中引入另一个变量的开销很小。

但是,这仅在函数确实在迭代中声明时才相关,如您的示例中所示。如果你有一个

function executeAll(cb) {
    for (var i = 0; i < 100000000; i++) {
        cb();
    }
}

那么没有区别

executeAll(function() { x++; });

function increase() { x++; }
executeAll(increase);

因为cb 参数是对one 函数的“静态”引用。

【讨论】:

  • @Sepp:视情况而定。如果您的意思是该事件经常被触发,那么不会。 addEventListener 在我的扩展答案中就像 executeAll
  • 所以server.on("data",function() { ... do processing ...} ) 在速度上与server.on("data",DoProcessing) 相同?
  • 您对executeAll的引用使我明白了相似之处。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2021-10-23
  • 2020-02-15
相关资源
最近更新 更多