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

项目中需要用到 大计算量 耗时的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执行时间

 

时间: 2024-10-17 02:44:38

js Memoization 针对cpu密集型运算 提高运行速度的相关文章

Node.js异步处理CPU密集型任务

Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景.然而数据密集型实时应用程序并不是只有I/O密集型任务,当碰到CPU密集型任务时,比如要对数据加解密(node.bcrypt.js),数据压缩和解压(node-tar),或者要根据用户的身份对图片做些个性化处理,在这些场景下,主线程致力于做复杂的CPU计算,IO请求队列中的任务就被阻塞. Node.js主线程的event loop在处理所有的任务/事件时,都是沿着事件队列顺序执行的,所以在其中任何一

转:Node.js异步处理CPU密集型任务的新思路

原文来自于:http://www.infoq.com/cn/articles/new-idea-of-nodejs-asynchronous-processing-tasks?utm_source=infoq&utm_medium=popular_links_homepage Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景.然而数据密集型实时应用程序并不是只有I/O密集型任务,当碰到CPU密集型任务时,比如要对数据加解密(node.bcrypt

数据密集型 和 cpu密集型 event loop

Node.js在官网上是这样定义的:“一个搭建在Chrome JavaScript运行时上的平台,用于构建高速.可伸缩的网络程序.Node.js采用的事件驱动.非阻塞I/O模型使它既轻量又高效,是构建运行在分布式设备上的数据密集型实时程序的完美选择.”Web站点早已不仅限于内容的呈现,很多交互性和协作型环境也逐渐被搬到了网站上,而且这种需求还在不断地增长.这就是所谓的数据密集型实时(data-intensive real-time)应用程序,比如在线协作的白板,多人在线游戏等,这种web应用程序

什么是CPU密集型、IO密集型?(转发)

CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高. 在多重程序系统中,大部份时间用来做计算.逻辑判断等CPU动作的程序称之CPU bound.例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU

什么是CPU密集型、IO密集型?

CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高. 在多重程序系统中,大部份时间用来做计算.逻辑判断等CPU动作的程序称之CPU bound.例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU

CPU密集型、IO密集型

CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存), I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高. IO密集型(I/O bound) IO密集型指的是系统的CPU性能相对硬盘.内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高

CPython在CPU密集型应用下的并发

Python是解释型语言,根据不同的底层协议有很多种版本,最常见的是基于C的Cpython,默认情况下我们所说的Python就是Cpython. Python的GIL(global interpreter lock): 用于解决多线程之间的数据完整性和状态同步而存在,使得不管线程分布在多少个CPU上,解释器同一时刻只允许1个线程运行. 所以Python是thread_safe的.这样其实Python就几乎只能进行单线程编程了. CPU密集型应用:(频繁计算) 从1开始累加,到1亿 1 def f

转:JS日期加减,日期运算

原文 出处http://hi.baidu.com/tonlywang/item/685fba8933a2a756e73d1950 一.日期减去天数等于第二个日期 function cc(dd,dadd) ...{ //可以加上错误处理 var a = new Date(dd) a = a.valueOf() a = a - dadd * 24 * 60 * 60 * 1000 a = new Date(a) alert(a.getFullYear() + "年" + (a.getMon

TI C66x DSP 四种内存保护问题 -之- 针对CPU访问外存(DDR3 or MSM)时的内存保护问题

实际上也是一个二分查找的问题. 要找出范围,决定了当找到这个数时不能马上返回,如果找target最前面的那个位置,只有当这个位置等于target,且这个位置的前一个位置不等于target时,才能返回这个位置.如果找的是target最后面的那个位置,那么只有当这个位置等于target,且这个位置的后一个位置不等于target时,才会返回它.不满足返回条件时,下一次递归走什么位置也不一样,找前面的时候,小于等于都往前半走,找后面的时候,大于等于都往后半半儿找. 觉得我实现的有点丑,往前往后找其实差别