HTML5标准与性能之三:ParallelArray

前面两篇文章分别介绍了WebWorkersTyped 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实现,提供多种并行计算常用的接口,例如mapreduce等等,利用多核和并行计算指令(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)
}

下面来解释一下这个例子:

  1. 参数vector是一个多维向量

  2. 通过new ParallelArray(vector)创建ParallelArray的对象

  3. 调用map函数,这个函数用于实现映射计算,数组的每个元素会作为参数传给回调函数,把返回值作为新的数组的相应元素,在这个例子中,回调函数计算了每个元素的平方,map的返回值是每个元素的平方的ParallelArray

  4. 由于map的返回值仍然是ParallelArray,我们可以再调用它的reduce函数,这个函数用于实现归约计算,之前的归约结果作为previousValue,每一个元素作为currentValue传入回调函数,其返回值作为previousValue传入下一轮计算,在这个例子中通过return previousValue + currentValue进行简单的累加计算

  5. 最后调用Math.sqrt(normSquare)开平方

看到这儿大家应该对ParallelArray有了基本的了解,那到底ParallelArray能带来多少的性能提升呢?我们来看jsperf上一个ParallelArray与Array性能测试,在测试机(配置如下表)上ParallelArray相对Array带来了4倍左右的性能提升。

NameConfiguration
CPU Intel Core i5 2520M (2.5G dual-core with HT)
Memory 4G
Browser Firefox Nightly 23.0a1 (2013-05-12)

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.