`
zhouyrt
  • 浏览: 1172014 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

冗余换性能-从Backbone的triggerEvents说开了去

 
阅读更多

Backbone是一个优秀的前端MVC库,它的代码质量必定可靠。阅读过程中发现了函数triggerEvents有点意思,初看会以为一些代码是多余的。

var triggerEvents = function(events, args) {
    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
    switch (args.length) {
      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
    }
};

这段是Backbone.Events中的派发事件的核心函数。执行顺序大概是

  1. 把事件处理函数依次取出执行
  2. 根据第二个参数args的长度做分支处理
  3. args长度为3及以下时使用call,长度3以上时使用apply

如果把call的都去掉,直接使用apply,那么程序的逻辑正确性没有问题。如下

var triggerEvents = function(events, args) {
    var ev, i = -1, l = events.length;
    while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
};

 

代码还精简了。Backbone却加上了以上使用call这些代码,来看注释

// A difficult-to-believe, but optimized internal dispatch function for
// triggering events. Tries to keep the usual cases speedy (most internal
// Backbone events have 3 arguments).

 

虽然难以相信,但却是为了性能考虑。多数Backbone内部方法触发事件时会传3个参数,即会使用call(而非apply)。

按此推理,call的性能较apply要高。搜关键字 "call apply performance", 貌似印证了这个说法

这是jsperf.com上的一个测试


 

从测试结果可以看出,多数浏览器中call的性能都好于apply,只有Safari5和Safari6中两者性能差不多。因此,Backbone是用冗余的代码换取了运行时的性能。

 

注:版本Backbone 1.0

相关:

http://jsperf.com/call-apply/3

what-is-the-difference-between-call-and-apply

why-are-call-and-apply-slower-than-a-direct-function-call-in-javascript

 

 

  • 大小: 12.3 KB
分享到:
评论

相关推荐

    Faster R-CNN backbone - ResNet101.zip

    总结来说,"Faster R-CNN backbone - ResNet101.zip"是一个包含Faster R-CNN目标检测模型中ResNet101预训练权重的文件。这个文件可以用于构建和优化目标检测系统,特别是当目标检测任务需要处理大量的图像数据时,...

    Faster R-CNN backbone - VGG16.zip

    Faster R-CNN(快速区域卷积神经网络)是一种用于目标检测的深度学习模型,它在计算机...而"Faster R-CNN backbone - VGG16.ckpt"文件则是一个关键资源,它封装了模型的预训练知识,能够帮助用户快速进入实际应用阶段。

    Pro Single Page Application Development - Using Backbone.Js and ASP.Net.2014

    Pro Single Page Application Development - Using Backbone.Js and ASP.Net by Gil Fink and Ido Flatow.2014

    SPA-with-Backbone, Backbone.jsでsingle pageアプリケーションを作る方法.zip

    "SPA-with-Backbone-master"可能是项目仓库的名字,其中的"master"分支通常代表项目的主分支,包含最新且稳定的代码。这暗示这个压缩包可能包含了一个完整的、用于创建SPA的Backbone.js示例项目,用户可以下载并按照...

    Hysteresis-to-Backbone_gaussian_

    标题 "Hysteresis-to-Backbone_gaussian_" 指示我们正在处理一个与计算或分析相关的程序或脚本,特别关注“hysteresis”(滞后效应)与“backbone”(基本结构),并且采用了高斯脉冲作为处理手段。在数学和信号处理...

    论文研究-基于Backbone的极值进化算法.pdf

    但个体解接近最优解后改善缓慢,无法快速到达最优解,为此引入组合优化问题解的Backbone概念,在种群进入最优解域后固定解中的相同部分,从而保留解中包含的最优解的信息,在减小问题规模后继续进行优化,增强搜索...

    前端项目-backbone.validation.zip

    在前端开发领域,Backbone.js 是一个非常受欢迎的JavaScript库,它为构建复杂的应用程序提供了一个轻量级的框架。Backbone.Validation 插件是针对Backbone.js设计的一个验证工具,用于帮助开发者轻松地实现对模型...

    react-backbone, Backbone 感知mixin用于响应和更多.zip

    react-backbone, Backbone 感知mixin用于响应和更多 反应中枢为 Backbone 提供对你的的响应,以响应你的组件,。将 backbone/backbone 。集合感知awareness你的反应组件mixin用于更新模型更改事件,请注意xhr活动和...

    awesome-backbone, backbone.js的资源列表.zip

    awesome-backbone, backbone.js的资源列表 backbone.js backbone.js的资源列表常规backbone.jsGithub知识库注释源代码Backbone 插件插件Backbone 索引 - 发现新的Backbone 插件和资源Backbone

    前端项目-backbone-relational.zip

    这个项目“前端项目-backbone-relational.zip”显然包含了使用Backbone-relational来管理复杂数据结构的代码实例。 Backbone.js 的核心特性包括模型(Model)、视图(View)、集合(Collection)和路由(Router)。...

    vue-backbone-有助于Backbone集成的Vue.js插件。-Vue.js开发

    vue-backbone Vue.js插件,可促进从Backbone的逐步迁移。 骨干集合和模型可以与Vue实例vue-backbone Vue.js插件安全集成,以促进从Backbone的逐步迁移。 骨干集合和模型可以安全地与Vue实例和组件集成在一起,并专注...

    generator-backbone, 搭建 backbone.js 项目.zip

    generator-backbone, 搭建 backbone.js 项目 backbone.js 发生器 提供功能样板 Backbone 应用程序的Backbone 生成器,可以从框中提供功能样板应用程序。 你还可以访问许多子生成器,可以轻松地创建单独的模型。视图...

    前端项目-backbone-pageable.zip

    【标题】"前端项目-backbone-pageable.zip" 涉及到的是一个基于Backbone.js框架的分页解决方案。Backbone.js是一款轻量级的JavaScript库,它为前端开发提供了模型(Model)、视图(View)、集合(Collection)以及...

    Hysteresis-to-Backbone_骨架曲线_HYSTERESISmatlab_matlab滞回曲线_滞回曲线_滞回骨

    在地震工程领域,滞回曲线和骨架曲线是分析结构抗震性能的重要工具。这些概念与MATLAB编程紧密相关,尤其在处理实验数据时。本资源包提供了MATLAB代码,旨在简化从抗震试验数据中提取滞回曲线及骨架曲线的过程,使得...

    前端项目-backbone.radio.zip

    **标题解析:** ...总结来说,这个"前端项目-backbone.radio.zip"提供了学习和实践Backbone.Radio消息传递模式的机会,通过分析源码和理解项目结构,开发者可以更好地掌握前端应用中的组件通信策略。

    前端项目-backbone-localstorage.js.zip

    在这个场景中,我们关注的是一个名为"前端项目-backbone-localstorage.js.zip"的压缩包,它包含了使用`Backbone.js`的一个扩展,即`Backbone.LocalStorage`,用于将数据存储在浏览器的本地存储(localStorage)中,...

    backbone-boilerplate, 用于构建 Backbone 应用程序的工作流.zip

    backbone-boilerplate, 用于构建 Backbone 应用程序的工作流 Backbone 模板这个样板是许多研究和挫折的产物。 现有boilerplates自由修改 Backbone 核心,缺少构建过程,并且非常规范;Backbone 样板文件的变更。...

    backbone-boilerplate, 一组用于构建 backbone.js 应用程序的最佳实践和实用工具.zip

    backbone-boilerplate, 一组用于构建 backbone.js 应用程序的最佳实践和实用工具 Backbone 模板这个样板是许多研究和挫折的产物。 现有的boilerplates修改 Backbone 核心,没有构建过程,或者者是非常规范的,这样的...

    前端项目-backbone.epoxy.zip

    "前端项目-backbone.epoxy.zip" 这个标题暗示了这是一个关于前端开发的项目,其中使用了Backbone.Epoxy库。Backbone.Epoxy是基于Backbone.js的一个扩展,它提供了更方便的数据绑定机制,使得前端开发更加优雅和高效...

    前端项目-backbone-react-component.zip

    前端项目-backbone-react-component,backbone.react.component是react.component的一个包装,它将facebook的react的所有功能都带到backbone.js上。

Global site tag (gtag.js) - Google Analytics