setter功能的速度不是预期的

时间:2014-10-08 21:53:42

标签: javascript getter-setter jsperf

我正在比较两种不同类型的设置者的表现,如下所示:

var q={};
var z={};
(function(){
  var x=1;
  q.x=function(){
    return x;
  };
  q.x.set=function(val){
    x=val;
  };
})();
(function(){
  var x=1;
  z.x=function(){
    return x;
  };
  z.x_set=function(val){
    x=val;
  };
})();

不同之处在于存储setter的位置:q.x.set vs z.x_set。我希望z变体运行得更快,因为它需要少一个表查找。相反,q变体一直更快。有什么想法吗?这是jsperf:http://jsperf.com/hq7f3

1 个答案:

答案 0 :(得分:0)

您的实验现在有来自各种浏览器的一些结果。让我们看看结果。

因此我们希望zq更快。但是当我们检查结果时,我们会看到两种不同的结果。

  1. 结果几乎相同,趋向于q略快一些。
  2. z明显更快。
  3. 这告诉我的是,这是各种JS引擎的实现细节的摆布。不同的JS引擎使用大量的低级优化,这改变了这些非常小的原子操作的时序特性。也许q模式会触发z在某些浏览器中不存在的优化。或者也许某些浏览器对旧版浏览器不支持的z模式进行了优化。但鉴于缺乏一致性,为什么很难回答。

    到目前为止,结果显而易见的一点是平均 zq更快。有时q会更快,但当z更快时,速度会快得多。

    chart!


    但实际上,差异可以忽略不计。这是一个很小的操作。微小操作中的微小变化可能导致从百分比角度进行大的变化,但是在更大的应用程序中对性能曲线的变化非常小。就个人而言,我认为这在学术上很有意思,但实际上没有什么后果。