Web 技术研究所

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

Generator 的性能问题

  最近在一些项目中为了解决繁琐的同步回调问题使用了 Generator。可是心中一直都很不安稳,因为我并不了解 Generator 的性能如何。所以现在我们做一些实验,来看看各引擎上 Generator 的性能如何。我想搞明白这些性能究竟耗损在何处?如何解决这些性能问题。
  下面是一个测试代码,里面对普通函数调用和 Generator 函数调用的性能做了个对比 <script src="https://share.web-tinker.com/performance.js"></script> <script> const test1 = function() { return true; }; const test2 = function*() { return true; }; </script> <button>test1()</button> <button>test2()</button> <button>test2().next()</button>
  从这个结果中可以看出,原生的函数调用比 Generator 函数快得多,而且如果 Generator 的 next 被调用的话还会更慢。
  其实 Generator 是要动态生成 next 这个函数所以慢,而 next 本身是一次函数调用,所以会更慢。如果我们手动模拟一个 Generator 呢?
<script src="https://share.web-tinker.com/performance.js"></script> <script> const test1 = function() { return true; }; const test2 = function() { let next = function () { let done = true; let value = true; return { done, value }; }; return { next }; }; </script> <button>test1()</button> <button>test2()</button> <button>test2().next()</button>
  其实结果和原生的 Generator 差不多,毕竟要多创建一个对象一个函数嘛。
  通过以上的测试可以总结出,Generator 的实现本身没有问题,但由于它的设计就是需要创建额外的对象和函数以及额外的调用,所以它会比较慢。性能敏感的东西使用 Generator 时应该考虑这些问题。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^