javascript - 这个编译为 JavaScript 的 Haskell 程序如何比 JavaScript 本身更快?

标签 javascript haskell ghc ghcjs

我一直认为,与手动编写和优化的代码相比,GHCJS 生成的 JavaScript 程序非常慢,原因很明显。不过,在试用它时,我发现它并没有我预期的那么糟糕。我决定运行一系列小型基准测试以了解真实性能,而这个让我特别惊讶。该程序只是用“1”填充数组并将它们相加。

haskell :

import Data.Array.Repa
len  = 1024*1024*64
arr  = fromFunction (Z :. len) (const 1) :: Array D DIM1 Float
main = sumAllP arr >>= print

JavaScript:

var len = 1024*1024*64
var arr = [];
var sum = 0;
for (var i=0; i<len; ++i)
    arr[i] = 1;
for (var i=0; i<len; ++i)
    sum += arr[i];
console.log(sum);

还有一个粗略的基准:

apple1$ ghcjs -O2 bench_fill.hs -funfolding-use-threshold10000 -funfolding-keeness-factor1000 -o bench_fill.js; time node bench_fill.js/all.js
Linking bench_fill.js (Main)
6.7108864e7

real    0m1.543s
user    0m1.512s
sys 0m0.033s

apple1$ time node benchfill.js
67108864

real    0m1.764s
user    0m1.173s
sys 0m0.583s

GHCJS 如何比纤细、干净的原生 for 循环运行得更快?考虑到生成的代码应该暴露的装箱量,这应该是不可能的。

最佳答案

Array D DIM1 Float 是一个 delayed array .它只是表示为函数 const 1 加上数组的边界。任何地方都没有存储 6400 万个 float 的数组。

JavaScript 程序实际上创建了一个包含 6400 万个 double 值的数组,它使用了 512 MB 的内存。读取和写入如此大的数组的成本是不可忽略的(分配它的成本也是如此;请注意大量的系统时间)。

关于javascript - 这个编译为 JavaScript 的 Haskell 程序如何比 JavaScript 本身更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28106229/

相关文章:

javascript - 在 Handlebars / Ember 模板中定义数组?

haskell - 如何报告 Haskell 代码中的错误

haskell - 测试两个异构值之间的相等性

javascript - 我无法使用此JS代码播放音频。语法正确,但是吗?

javascript - C1005 : Closure Compiler Warning (Parse error. 由于语法错误,名称无法识别。) -- 压缩输入:

javascript - 如何在不失去功能的情况下居中

html - Haskell:删除字符串中的 html 字符实体

haskell - 如何在 cabal repl 中自动加载导入?

haskell - 为什么performGC无法释放所有内存?

haskell - <<loop>> 错误 "work"的详细情况如何?