wasm runtime 性能测试
上一篇文章分享了wasmer runtime,编译好的openssl.wasm文件可以独立运行,这篇文章分享openssl.wasm和原生openssl之间的性能对比。
测试硬件
- 主机
- MacBook Pro
- CPU
- 6-Core Intel Core i7 2.2 GHz/启动超线程
- 内存
- 16GB
- 磁盘
- SSD
测试软件
-
Openssl
LibreSSL 2.8.3
-
Openssl WASM
openssl 版本 openssl 1.1.1d
wasmer 1.0.0-alpha4
测试方法
分别对 100/300/500 MB 进行多次加密解密,得到均值结果。注意,这里有些模式并不是标准的,所以没有全部模拟,仅供参考。
openssl 测试命令
#!/bin/bash
key="A665A45920422F9D417E4867EFDC4FB8"
iv="4632527467615238616971576a466653"
#file100、file300、file500
fileName="file100"
ecbEnFileName="ecb-en-${fileName}"
ecbDeFileName="ecb-de-${fileName}"
cbcEnFileName="cbc-en-${fileName}"
cbcDeFileName="cbc-de-${fileName}"
ctrEnFileName="ctr-en-${fileName}"
ctrDeFileName="ctr-de-${fileName}"
gcmEnFileName="gcm-en-${fileName}"
gcmDeFileName="gcm-dn-${fileName}"
echo "------start openssl-aes-128 encryption-------"
echo "------ECB Encryption-------"
time openssl enc -aes-128-ecb -in ${fileName} -out ${ecbEnFileName} -K ${key} -p
echo "------CBC Encryption-------"
time openssl enc -aes-128-cbc -in ${fileName} -out ${cbcEnFileName} -K ${key} -iv ${iv} -p
echo "------CTR Encryption-------"
time openssl enc -aes-128-ctr -in ${fileName} -out ${ctrEnFileName} -K ${key} -iv ${iv} -p
echo "------GCM Encryption-------"
time openssl enc -aes-128-gcm -in ${fileName} -out ${gcmEnFileName} -K ${key} -iv ${iv} -p
echo "#############################################################"
echo "------start openssl-aes-128 Decrypt-------"
echo "------ECB Decrypt-------"
time openssl enc -aes-128-ecb -d -in ${ecbEnFileName} -out ${ecbDeFileName} -K ${key} -p
echo "------CBC Decrypt-------"
time openssl enc -aes-128-cbc -d -in ${cbcEnFileName} -out ${cbcDeFileName} -K ${key} -iv ${iv} -p
echo "------CTR Decrypt-------"
time openssl enc -aes-128-ctr -d -in ${ctrEnFileName} -out ${ctrDeFileName} -K ${key} -iv ${iv} -p
echo "------GCM Decrypt-------"
time openssl enc -aes-128-gcm -d -in ${gcmEnFileName} -out ${gcmDeFileName} -K ${key} -iv ${iv} -p
openssl.wasm 测试命令
#!/bin/bash
key="A665A45920422F9D417E4867EFDC4FB8"
iv="4632527467615238616971576a466653"
#file100、file300、file500
fileName="file500"
ecbEnFileName="aes/ecb-en-${fileName}"
ecbDeFileName="aes/ecb-de-${fileName}"
cbcEnFileName="aes/cbc-en-${fileName}"
cbcDeFileName="aes/cbc-de-${fileName}"
ctrEnFileName="aes/ctr-en-${fileName}"
ctrDeFileName="aes/ctr-de-${fileName}"
# 创建需要的文件,wasm文件运行,不会把数据写入磁盘,所以需要提前准备文件
touch ${ecbEnFileName}
touch ${ecbDeFileName}
touch ${cbcEnFileName}
touch ${cbcDeFileName}
touch ${ctrEnFileName}
touch ${ctrDeFileName}
echo "------start openssl-aes-128 encryption-------"
echo "------ECB Encryption-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ecb -in ${fileName} -out ${ecbEnFileName} --nosalt -K ${key}
echo "------CBC Encryption-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-cbc -in ${fileName} -out ${cbcEnFileName} --nosalt -K ${key} -iv ${iv}
echo "------CTR Encryption-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ctr -in ${fileName} -out ${ctrEnFileName} --nosalt -K ${key} -iv ${iv}
echo "#############################################################"
echo "------start openssl-aes-128 Decrypt-------"
echo "------ECB Decrypt-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ecb -d -in ${ecbEnFileName} -out ${ecbDeFileName} --nosalt -K ${key}
echo "------CBC Decrypt-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-cbc -d -in ${cbcEnFileName} -out ${cbcDeFileName} --nosalt -K ${key} -iv ${iv}
echo "------CTR Decrypt-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ctr -d -in ${ctrEnFileName} -out ${ctrDeFileName} --nosalt -K ${key} -iv ${iv}
测试结果
-
Openssl
-
加密
/文件大小 100M 300M 500M key数据大小 B 0.197s 0.970s 1.418s 128bit C 0.244s 1.421s 1.278s 128bit R 0.203s 0.587s 1.145s 128bit M 0.303s 1.123s 1.710s 128bit -
解密
式/文件大小 100M 300M 500M key数据大小 ECB 0.309s 1.014s 1.275s 128bit CBC 0.260s 0.946s 1.630s 128bit CTR 0.322s 1.081s 1.591s 128bit GCM 0.429s 1.283s 1.842s 128bit
-
-
Openssl.wasm
-
加密
/文件大小 100M 300M 500M key数据大小 ECB 1.775s 5.326s 8.996s 128bit CBC 1.805s 5.563s 9.452s 128bit CTR 2.011s 6.133s 10.350s 128bit -
解密
/文件大小 100M 300M 500M key数据大小 ECB 1.894s 5.780s 9.186s 128bit CBC 1.880s 5.892s 10.123s 128bit CTR 2.168s 6.297s 11.424s 128bit
-
结论
openssl.wasm与openssl根据不同加解密模式以及不同大小文件进行耗时对比来看,openssl.wasm速度没有原生的openssl执行效率高。具体什么原因,我也很好奇,网上的资料并不是很多,通过之前对wasm的研究个人理解可能是因为wasm虚拟机导致运行速度不是那么快。
WebAssembly的定义是基于堆栈的虚拟机的二进制指令格式。堆栈虚拟机模型是常见的内存管理结构,将数据和操作符压入栈中并弹出逐次执行。wasm的二进制指令是虚拟指令集,虚拟指令集(V-ISA)可以认为是对平台无关的一系列自定义操作符(如JVM),相对的,物理指令集(ISA)则是强依赖物理系统的(如Intel的x86-64)。
因为WASM依赖的是V-ISA指令集,即完全依赖宿主环境提供的操作指令。所以如果要在真实的操作系统上运行,必须要有一个“虚拟机”来翻译这些指令并屏蔽具体系统调用之间的差异。即需要类似JVM的WASM VM,WASI便是定义这些抽象的系统调用抽象层,WASM平台的系统接口。从而实现"一次编译,到处运行"的特点。
另一个特点是WASM安全性,WASM采用了沙箱机制。这意味着代码不能直接与操作系统交互。那么它是如何利用系统资源的呢?宿主机(可能是浏览器,也可能是 WASM 运行时)将函数放入代码可以使用的沙箱中。即虚拟机完全负责权限的控制,所有系统调用由外围控制,隔离出沙箱环境,这样可以避免第三方库带来的安全问题。
从可移植性和安全性上来分析,openssl.wasm对比直接在主机上安装的openssl,效率低一点是有道理的,不仅如此,在不同平台上wasm的速度也是有差异的。目前wasm还在发展阶段,感兴趣的朋友可以继续关注wasm动态。
使用场景
浏览器中应用 WebAssembly 的场景,比如:
- 将 C、C++、Rust 等语言编写的程序移植到浏览器
- 游戏:
- 需要快速打开的小游戏
- AAA 级,资源量很大的游戏。
- 游戏门户(代理/原创游戏平台)
- 图形图像处理领域,如页游、数据可视化等
- 加密工具
- CAD 软件
- 音视频编解码等等
非浏览器应用场景,官方文档中也列了一些,不过都比较抽象
-
Fastly 与其他服务商的边缘云
-
Node 与 npm(参见译文)
- “WebAssembly 可以解决 Node 中最大的问题之一——如何获得接近原生速度,并像使用原生模块一样复用其他语言(如 C 与 C++)编写的代码,同时仍保持可移植性与安全性。 标准化这个系统接口是实现这一目标的第一步。”
- “npm 极为感兴趣的是,WebAssembly 潜在具有扩展 npm 生态系统、并同时极大地简化在服务端 JavaScript 应用程序中运行原生代码过程的能力。 我们期待这个过程的结果。”
-
插件系统。无论浏览器、IDE 还是任何其他地方的插件系统如果采用 WebAssembly 既能保证安全性避免插件代码越权,也能与开发语言解耦、有利于插件生态的繁荣。
更多使用场景参见 官方文档
未来方向
- 添加后续特性到 WebAssembly 标准的过程
- 直接操作 DOM
- 共享内存的并发性
- SIMD(单指令,多数据)
- 异常处理
- 其他改进——使开发者开发起来更简单
- 一流的开发者工具
- 垃圾回收
- ES6 模块集成。