javascript 中 MD5 计算的预期性能?

Expected performance of MD5 calculation in javascript?

我正在尝试使用 javascript 计算 MD5 并查看 fastest MD5 Implementation in JavaScript post 'JKM' implementation is suppose to be one of the faster implementations. I am using SparkMD5 which is based of off JKM implementation. However the example provided https://github.com/satazor/SparkMD5/blob/master/test/readme_example.html 对于一个 13MB 的文件大约需要 10 秒(使用调试器大约需要 23 秒),而使用 linux 命令行中的 md5sum 函数只需要 0.03 秒。这些结果对于 javascript 实施来说是否太慢了,或者这种糟糕的表现是预期的吗?

符合预期。

首先,我认为我不需要告诉您 JAVASCRIPT 很慢。是的,即使使用现代 JIT 优化等。JavaScript 仍然很慢。

为了向您表明这不是您的 JS 实现的错,我将与 Node.js 进行一些比较,以便浏览器 DOM 不会妨碍基准测试。

测试文件生成:

$ dd if=/dev/zero of=file bs=6M count=1

(我的服务器只有 512 MB 内存,Node.js 不能超过 6M)

脚本:

//var md5 = require('crypto-js/md5')
var md5 = require('MD5')
//var md5 = require('spark-md5').hash
//var md5 = require('blueimp-md5').md5

require('fs').readFile('file', 'utf8', function(e, b) {  // Using string here to be fair for all md5 engines
  console.log(md5(b))
})

(您可以取消注释 contestants/benchmarkees)

结果是:(删除了文件读取开销)

  • MD5: 5.250s - 0.072s = 5.178s
  • crypto-js/md5: 4.914s - 0.072s = 4.842s
  • Blueimp:4.904s - 0.072s = 4.832s
  • MD5 与 Node.js 二进制缓冲区而不是字符串:1.143s - 0.063s = 1.080s
  • 火花:0.311s - 0.072s = 0.239s
  • md5sum: 0.023s - 0.003s = 0.020s

所以不,spark-md5 实际上一点也不差。

查看示例 HTML 页面时,我看到他们使用的是增量 API。所以我做了另一个基准测试:

var md5 = require('spark-md5')

var md5obj = new md5()
var chunkNum = 0

require('fs').createReadStream('file')
  .on('data', function (b) {
    chunkNum ++
    md5obj.append(b.toString())
  })
  .on('end', function () {
    console.log('total ' + chunkNum + ' chunks')
    console.log(md5obj.end())
  })

96个chunk,是0.313s

所以不,这根本不是 MD5 实现的错。性能 这个 差是 TBH 有点令人惊讶,但也不是完全不可能,你是 运行 浏览器中的这个代码。

顺便说一句,我的服务器是带有 SSD 的 DigitalOcean VPS。文件读取开销约为0.072s:

require('fs').readFile('file', 'utf8', function() {})

而原生 cat 大约是 0.003 秒。

对于带有原生Buffer的MD5,开销约为0.063s:

require('fs').readFile('file', function() {})