Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

函数的垂直嵌套调用性能思考

  以前用 xhr 对象的 onreadystatechange 事件时希望它可以绑定多个事件处理函数,可是 IE 不支持在 xhr 对象的 attachEvent 于是就在原来的处理函数外包裹一个函数来解决这个问题。意识到 ES7 描述器的实现思想也是给函数外面包一层,这么做是不是会存在性能问题呢?
  下面这个代码是以前 IE 上用来给 xhr 对象绑定多个 onreadystatechange 的 var bindNext = function(xhr, handler) {
  // 保存旧处理函数
  var prev = xhr.onreadystatechange;
  // 绑定新函数
  xhr.onreadystatechange = function() {
    // 调用旧处理函数
    if(typeof prev === 'function') prev.apply(this, arguments);
    // 调用新处理函数
    handler.apply(this, arguments);
  };
};

bindNext(xhr, function() {
  // handle1
});

bindNext(xhr, function() {
  // handle2
});
  代码可以正常工作,但每次看到这种代码都会让我觉得不爽。这样垂直地调用不会有性能问题之类的么?很明显每次绑定除了要处理本来会调用到的处理函数外还多了个用于打包新旧处理函数的匿名函数。也就是说,每一个绑定需要执行两个函数,所以函数调用的开销大了一倍?看起来是个性能的坑,然而这个结论非常理论化,而且「大一倍」这种结论只是听起来吓人,实际上完全不影响时间复杂度。这个结论不能作为实际场景性能评估的依据。比如就上面这个 onreadystatechange 的触发频率而言,函数调用的开销大一倍又何妨?大十倍也是几乎可以忽略的。
  所以吧,这种垂直嵌套调用的方式虽然直觉上可能会存在性能问题,但这个影响是很微小的,除非是高运算密集型的代码才可能受到影响。然而运算密集型的程序性能优化应该是祛 OO 的,避免使用 new 之类的运算符才是根本,不至于纠结到函数调用这种问题上。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^