前面两篇文章分别介绍了WebWorkers和Typed Array,下面我们来介绍一下另一个针对性能的JS API:ParallelArray。
ParallelArray
ParallelArray
是由Intel提出的JS并行计算的API(代号为RiverTrail),利用这个API,可以大大提高JS处理海量数据的性能。ParallelArray
已提交给JS标准ECMAScript作为下一代JS标准,现在只有最新的Firefox Nightly浏览器支持ParallelArray
,在早期的Firefox浏览器上可以通过Firefox扩展来启用ParallelArray,另外在Chromium上也有通过V8 Binding方式来实现的版本。
ParallelArray
底层基于OpenCL实现,提供多种并行计算常用的接口,例如map
、reduce
等等,利用多核和并行计算指令(SSE/AVX)来提升JS计算性能。在高性能计算、图像处理和游戏等需要大量计算的场景下,ParallelArray给予JS更强的并行计算能力,弥补性能不足的短板,让HTML5开发者可以更加关注应用本身,充分发挥HTML5跨平台的优势。
下面我们就通过一个例子来简单看下ParallelArray
的用法:
// 计算多维空间向量的模(Vector Norm) function norm(vector) { // (1) var pa = new ParallelArray(vector); // (2) var normSquare = pa.map(function (x) { // (3) return x * x; }).reduce(function (previousValue, currentValue) {// (4) return previousValue + currentValue; }); return Math.sqrt(normSquare); // (5) }
下面来解释一下这个例子:
参数
vector
是一个多维向量通过
new ParallelArray(vector)
创建ParallelArray
的对象调用
map
函数,这个函数用于实现映射计算,数组的每个元素会作为参数传给回调函数,把返回值作为新的数组的相应元素,在这个例子中,回调函数计算了每个元素的平方,map
的返回值是每个元素的平方的ParallelArray
由于
map
的返回值仍然是ParallelArray
,我们可以再调用它的reduce
函数,这个函数用于实现归约计算,之前的归约结果作为previousValue
,每一个元素作为currentValue
传入回调函数,其返回值作为previousValue
传入下一轮计算,在这个例子中通过return previousValue + currentValue
进行简单的累加计算最后调用
Math.sqrt(normSquare)
开平方
看到这儿大家应该对ParallelArray有了基本的了解,那到底ParallelArray能带来多少的性能提升呢?我们来看jsperf上一个ParallelArray与Array性能测试,在测试机(配置如下表)上ParallelArray相对Array带来了4倍左右的性能提升。
Name | Configuration |
---|---|
CPU | Intel Core i5 2520M (2.5G dual-core with HT) |
Memory | 4G |
Browser | Firefox Nightly 23.0a1 (2013-05-12) |