在JavaScript中预期的MD5计算性能?

Nic*_*yev 5 javascript md5 md5sum

我正在尝试使用javascript计算MD5并在JavaScript中查看 最快的MD5实现 'JKM'实现被认为是更快的实现之一.我正在使用基于JKM实现的SparkMD5.但是提供的示例https://github.com/satazor/SparkMD5/blob/master/test/readme_example.html对于13MB文件大约需要10秒(使用调试器大约需要23秒),而同一文件只需要0.03秒使用md5sum函数linux命令行.这些结果对于javascript实现来说是否太慢或预计会出现这种糟糕的性能?

Tim*_* Gu 6

这是预料之中的.

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

为了向您展示它不是您的JS实现的错误,我将与Node.js进行一些比较,以便浏览器DOM的东西不会妨碍基准测试.

测试文件生成:

$ dd if=/dev/zero of=file bs=6M count=1
Run Code Online (Sandbox Code Playgroud)

(我的服务器只有512 MB的RAM,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))
})
Run Code Online (Sandbox Code Playgroud)

(你可以取消评分参赛者/基准)

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

  • 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())
  })
Run Code Online (Sandbox Code Playgroud)

有96个块,它是0.313s.

所以不,它根本不是MD5实现的错误.性能差是TBH有点令人惊讶,但并非完全不可能,您在浏览器中运行此代码.

顺便说一下,我的服务器是带SSD的DigitalOcean VPS.文件读取开销约为0.072秒:

require('fs').readFile('file', 'utf8', function() {})
Run Code Online (Sandbox Code Playgroud)

虽然与原生cat它约0.003s.

对于具有本机缓冲区的MD5,开销约为0.063秒:

require('fs').readFile('file', function() {})
Run Code Online (Sandbox Code Playgroud)