主要观点总结
本文主要介绍了通过插桩计时对WebAssembly(WASM)进行性能分析的方法和实现。首先介绍了WebAssembly和WAVM的相关知识,然后详细描述了性能分析的方法,包括插桩函数设计、优化方案、插桩WASM的具体步骤和输出火焰图的过程。最后总结了性能分析的不足和参考链接。
关键观点总结
关键观点1: 介绍WebAssembly(WASM)和WAVM
WASM是一种低级别的字节码格式的汇编语言,可以从C/C++、Rust等高级语言编译而来,最初设计是在Web端实现接近原生的执行效率。WAVM是WASM的一个执行环境,采用JIT模式执行WASM。
关键观点2: 性能分析的方法
通过对WASM进行插桩计时来进行分析,包括插入perf_start和perf_end函数,记录函数执行时间和调用栈结构。使用哈希表记录数据,优化开销,最终生成火焰图。
关键观点3: 插桩WASM的具体步骤
包括将perf_start和perf_end函数添加到WASM的Import Section,修改WASM的其它Section,如Type Section、Function Section等。插桩完成后生成新的WASM文件。
关键观点4: 输出火焰图
将插桩后的WASM文件运行,生成perf.folded文件,然后使用flamegraph.pl脚本将perf.folded文件转换为火焰图,直观展示调用流程和开销占比。
关键观点5: 性能分析的不足
插桩后WASM执行效率下降,观察者效应导致准确率下降;性能分析流程复杂,增加了一个插桩的过程,对WASM文件需要重新构建,加大了实际分析的复杂性。
文章预览
阿里妹导读 本文结合了代码插桩和性能火焰图的技术,以 WebAssembly 为例介绍了性能分析的方法和相关实现。 最近对 WebAssembly 代码性能分析(Profiling)做了一些实践,发现一些思路和方法对其他即时编译(JIT)代码也是通用的。本文以 WebAssembly 为例介绍一下性能分析的方法。 WebAssembly 和 WAVM 首先简单介绍一下 WebAssembly (下简称 WASM)[1],WASM是一个 low-level 的字节码格式的汇编语言,可以从 C/C++,Rust 等高级语言编译而来,最初设计是在Web端实现接近原生的执行效率(目前主流浏览器都支持了), 应用的例子[2] 有 Web 版的 Unity,Tensorflow, AutoCAD,Google Earth 等。 由于 WASM 可移植性好,很多项目也开始在非浏览器环境用 WASM,即通过 VM/Runtime 运行 WASM。本文讨论的就是对 VM 执行 WASM 进行性能分析,WASM 的 VM/Runtime 很多,近年也有一些陆续做了性能分析的
………………………………