javascript中MD5计算的预期性能
Expected performance of MD5 calculation in javascript?
我正在尝试使用javascript计算MD5JavaScript中最快的MD5实现后"JKM"实现被认为是更快的实现之一。我使用的SparkMD5是基于非JKM实现的。然而,所提供的示例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
(我的服务器只有512MB的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))
})
(您可以取消对参赛者/基准的注释)
结果是:(删除了文件读取开销)
- MD5:5.250s-0.072s=5.178s
- crypto-js/md5:4.914s-0.072s=4.842s
- 蓝精灵: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个块,它是0.313s。
所以不,这根本不是MD5实现的错。性能这个差是TBH有点令人惊讶,但也不是完全不可能,因为您正在浏览器中运行此代码。
顺便说一句,我的服务器是带SSD的DigitalOcean VPS。文件读取开销约为0.072s:
require('fs').readFile('file', 'utf8', function() {})
而天然cat
的约为0.003s
对于带有本机缓冲区的MD5,开销约为0.063s:
require('fs').readFile('file', function() {})
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- 根据元素和容器大小计算边距
- 从Rally获取一个特定的标记,以便计算另一个字段中的值
- 使用D3.js计算带有字母间距的文本长度
- 使用正则表达式评估电子邮件地址时出现性能问题
- React:按键的性能提升
- 在Three.js中导出网格会提高性能吗
- 使用CSS或JavaScript计算分页符的数量
- 可以't计算自定义谷歌地图的js
- 在javascript中搜索项目列表的性能
- 如何计算每个元素's的高度,并将这些值用作函数中的变量
- JavaScript计算帮助(乘以时间)
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- javascript中MD5计算的预期性能
- JavaScript 算法性能 - 计算可被 k 整除的范围内的数字数
- 如何提高javascript html5程序的整体性能:是否可以在两台计算机上同步两个版本
- 如何在客户端计算机上测量 JavaScript 繁重网页的性能
- 缩放传单容器以提高性能,计算问题
- Javascript循环性能:计算一个数字在有限序列中的出现次数