2

在最新的 safari (5.1.7) 和移动 safari 中,通过闭包访问对象时,命名函数和匿名函数之间存在巨大的性能差异。请参阅http://jsperf.com/nfe-fe/2

这在早期版本的 safari 中不是问题,但在更高版本中似乎是一个问题。

有什么方法可以提高命名函数表达式的性能?我喜欢命名函数有两个原因 - 易于查看堆栈跟踪并使用 .name 属性获得更好的日志。最新的 safari 中的 bug 严重降低了我们应用程序的性能。

我在下面给出了 jsperf 中使用的测试代码:

准备代码

  Benchmark.prototype.setup = function() {

    var FunctionExpressionCreator = function () {

      var i = 0;
      this.a = function () {
        return ++i;
      }

      this.test = function () {
        for (var i = 0; i < 100; ++i) {
          this.a();
        }
      }
    };

    var functionExprObject = new FunctionExpressionCreator();

    var NamedFunctionExpressionCreator = function () {
      var i = 0;
      this.a = function a() {
        return ++i;
      }

      this.test = function test() {
        for (var i = 0; i < 100; ++i) {
          this.a();
        }
      }
    };

    var namedFunctionExprObject = new NamedFunctionExpressionCreator();
  };

测试1:命名函数ExprObject.test();

测试2:函数ExprObject.test();

在最近的 iOS 和 Safari 5.1.7 上,Test1 的运行速度比 Test2 慢 85%,但两者在早期版本中的运行速度相当。

4

0 回答 0