javascript - underscore源码效率问题
迷茫
迷茫 2017-04-11 09:47:19
[JavaScript讨论组]

对underscore的调用过程还是不太明白呢,如下:
调用方式一:

var iterations = 1000000;
console.time('#optimizeCb');
for(var i = 0; i < iterations; i++ ){
  _.each([1,2,3],function(val,key){});
};
console.timeEnd('#optimizeCb')

VM57585:7 #optimizeCb: 1791.113ms

调用方式二:

var iterations = 1000000;
console.time('#optimizeCb');
for(var i = 0; i < iterations; i++ ){
  _([1,2,3]).each(function(val,key){});
};
console.timeEnd('#optimizeCb')

VM57586:7 #optimizeCb: 2332.177ms

为啥效率差别这么大,第二种慢主要是因为有实例化过程吗?希望大神指教呀?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
高洛峰

看着好像是实例化问题,但是如果代码这样写的话:

            var iterations = 1000000;
            console.time('#init');
            var obj = _([1,2,3]);
            console.timeEnd('#init');
            console.time('#optimizeCb0');
            for(var i = 0; i < iterations; i++ ){
              obj.each(function(val,key){});
            };
            console.timeEnd('#optimizeCb0')
            console.time('#optimizeCb');
            for(var i = 0; i < iterations; i++ ){
              _.each([1,2,3],function(val,key){});
            };
            console.timeEnd('#optimizeCb');
assign:20 #init: 0.000ms
assign:25 #optimizeCb0: 492.000ms
assign:30 #optimizeCb: 223.000ms

看输出的时间,实例化貌似问题不大,重点在于调用_.each_().each的区别

我没用过后者,跟踪了一下源码看其实现:

 // Helper function to continue chaining intermediate results.
  var result = function(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  };

  // Add your own custom functions to the Underscore object.
  _.mixin = function(obj) {
    _.each(_.functions(obj), function(name) {
      var func = _[name] = obj[name];//这里遍历的时候 name 有为each的时候
      _.prototype[name] = function() {//当name='each'时,_的原型就有了each方法,此时func=_.each
        var args = [this._wrapped];
        push.apply(args, arguments);
        return result(this, func.apply(_, args));
      };
    });
  };

从这里也可以看出_().each实际上底层也是用了_.each,但是人家不是直接用,还多了一些赋值啊,数组push等操作,我想后者多花的时间应该出自这些操作吧。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号