为了账号安全,请及时绑定邮箱和手机立即绑定

underscore源码效率问题

underscore源码效率问题

慕桂英3389331 2018-09-10 10:19:42
对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 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

            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.000msassign:25 #optimizeCb0: 492.000msassign: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等操作,我想后者多花的时间应该出自这些操作吧。

查看完整回答
反对 回复 2018-10-31
  • 1 回答
  • 0 关注
  • 490 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信