关于rust:wasm-runtime-性能测试

11次阅读

共计 5809 个字符,预计需要花费 15 分钟才能阅读完成。

上一篇文章分享了 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 数据大小 |
| —- | —- | —- | —– |—- |
| ECB | 0.197s | 0.970s | 1.418s | 128bit |
| CBC | 0.244s | 1.421s | 1.278s | 128bit |
| CTR | 0.203s | 0.587s | 1.145s | 128bit |
| GCM | 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 既能保障安全性防止插件代码越权,也能与开发语言解耦、有利于插件生态的凋敝。

更多应用场景参见官网文档:http://webassembly.org.cn/doc…

将来方向

  • 增加后续个性到 WebAssembly 规范的过程

    • 间接操作 DOM
    • 共享内存的并发性
    • SIMD(单指令,多数据)
    • 异样解决
    • 其余改良——使开发者开发起来更简略

      • 一流的开发者工具
      • 垃圾回收
      • ES6 模块集成。

参考文档

  • 在 web 之外运行 WebAssembly 的零碎接口 – 原文 作者:Lin Clark

    • https://hacks.mozilla.org/201…
  • 在 web 之外运行 WebAssembly 的零碎接口 – 译文

    • https://www.ituring.com.cn/ar…
  • WebAssembly 线上研讨会 2020 年 8 月 29 日 · 线上流动

    • https://www.w3.org/2020/08/29…

Netwarps 由国内资深的云计算和分布式技术开发团队组成,该团队在金融、电力、通信及互联网行业有十分丰盛的落地教训。Netwarps 目前在深圳、北京均设立了研发核心,团队规模 30+,其中大部分为具备十年以上开发教训的技术人员,别离来自互联网、金融、云计算、区块链以及科研机构等业余畛域。
Netwarps 专一于平安存储技术产品的研发与利用,次要产品有去中心化文件系统(DFS)、去中心化计算平台(DCP),致力于提供基于去中心化网络技术实现的分布式存储和分布式计算平台,具备高可用、低功耗和低网络的技术特点,实用于物联网、工业互联网等场景。
公众号:Netwarps

正文完
 0