码迷,mamicode.com
首页 > Web开发 > 详细

js Memoization 针对cpu密集型运算 提高运行速度

时间:2014-11-06 07:03:15      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   使用   java   sp   文件   div   on   

项目中需要用到 大计算量 耗时的js运算。

js是单线程模型 ,优点是异步操作,对于nodejs来说可以处理高并发的任务。 但对密集型的cpu运算,异步解决不了问题,正确的来说还是该新开个线程处理。

对前端开发来说 执行大计算量 耗时的js运算   不仅会阻塞ui线程 从而导致浏览器进入僵死状态,崩溃,同时部分浏览器还会跳弹窗询问是否停止 执行的脚本。

前端 有基于HTML5 的web workers 创建新的线程

本来是考虑用 web workers 。但是  两方面

1  新开的线程 不能操作dom (这是可以理解)

2  令人发指的api, web weorkers 的新开的线程必须在一个独立的文件中 ,传url以异步方式调用,这是我非常不能接受,破坏了我项目模块化的结构。  传说 ecmascript7  会有Multi-Threading  支持多线程  默默期待吧

 

放弃 web  workers意外 发现 underscore  提供了 Memoize  方法

原理是以 内存作为缓存 以内存空间换cpu的执行时间的 提高运行速度的方法。

magic  先看效果

以斐波那契数组 为例

当n>40  firfox  ie 都会弹出停止脚本的提示框,浏览器进入僵死状态,ui线程被阻塞

var fibonacci =function(n) {
    return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);
};
console.log(fibonacci (40))

 

使用 Memoize  方法, 成功执行 没有僵死,ui线程没有阻塞

var fibonacci = _.memoize(function(n) {
    return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);
});

document.write( fibonacci (40))

 

源码分析

 _.memoize = function(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = hasher ? hasher.apply(this, arguments) : key;
      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[key];
    };
    memoize.cache = {};
    return memoize;
  };

  以参数作为键进行缓存,被执行的结果按参数缓存在memo对象上,用内存空间 换cpu执行时间

 

js Memoization 针对cpu密集型运算 提高运行速度

标签:blog   io   ar   使用   java   sp   文件   div   on   

原文地址:http://www.cnblogs.com/breakdown/p/4077255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!