rbpf虚拟机-JIT和解释执行对比
文章目录
- 一、概述
- 二、定义
- 2.1解释执行
- 2.2 JIT编译执行
- 三、测试代码
- 3.1解释执行
- 3.2 JIT执行
- 四、结果
- 五、总结
Welcome to Code Block's blog本篇文章主要介绍了
[rbpf虚拟机-JIT和解释执行对比]
❤博主广交技术好友,喜欢我的文章的可以关注一下❤
一、概述
该篇文章是记录rbpf虚拟机JIT执行和解释执行的速度对比。
(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展。)
二、定义
2.1解释执行
代码在运行时由解释器逐行解释并执行,不需要提前编译
。例如,Python、JavaScript等脚本语言通常采用解释执行。
2.2 JIT编译执行
JIT在程序运行时根据需要将部分代码(如热点代码)编译成机器码
,而不是在程序运行前一次性编译所有代码。
三、测试代码
3.1解释执行
#[test]
fn test_process_time() {
let start = Instant::now();
let prog = assemble(
"
mov32 r0, 0
mov32 r1, 10000000
add32 r0, 1
sub32 r1, 1
jgt r1, 0, -3
exit
",
)
.unwrap();
let vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
for _i in 0..5 {
assert_eq!(vm.execute_program().unwrap(), 0x989680);
}
let duration_with_jit = start.elapsed();
eprintln!("未使用 JIT 的总时间: {:?}", duration_with_jit);
}
在上述代码中,使用解释执行,R0赋值为0,R1赋值为10000000,当R1不少于0时执行循环体,循环体内使R0加1,使R1减一,直到不满足循环条件时退出,此时应该返回R0的值为10000000(0x989680),该程序会被执行5次并记录时间。
通过面图片,可以看到该程序总共运行了14秒
钟。
3.2 JIT执行
#[test]
fn test_jit_time() {
let start = Instant::now();
let prog = assemble(
"
mov32 r0, 0
mov32 r1, 10000000
add32 r0, 1
sub32 r1, 1
jgt r1, 0, -3
exit
",
)
.unwrap();
let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
vm.jit_compile().unwrap();
let duration_with_jit = start.elapsed();
eprintln!("编译时间: {:?}", duration_with_jit);
unsafe {
for _i in 0..5 {
assert_eq!(vm.execute_program_jit().unwrap(), 0x989680);
}
}
let duration_with_jit = start.elapsed();
eprintln!("使用 JIT 的总时间: {:?}", duration_with_jit);
}
然后使用JIT编译和运行命令,执行同样的功能代码。
可以看到执行了执行了12毫秒
,也就是1.2%秒。
四、结果
未使用 JIT 的总时间:
从第一张图片可以看到,程序在未使用 JIT 的情况下,总共运行了约 14 秒。这包括了五次循环执行的时间以及解释器逐行解释代码的开销。
使用 JIT 的总时间:
第二张图片显示,使用 JIT 编译后,程序的总运行时间显著减少至 12 毫秒。
考虑到 JIT 编译本身需要一定的时间(在代码中 vm.jit_compile().unwrap(); 所记录的编译时间),实际执行循环体的时间会更短。
因此,JIT 编译后的执行速度相比解释执行有显著提升。
五、总结
通过对 rbpf 虚拟机中解释执行和 JIT 编译执行的对比测试,我们可以得出以下结论:
性能提升:JIT 编译在执行速度上显著优于解释执行,适合对性能要求较高的应用场景。
适用场景:对于需要频繁执行的热点代码,采用 JIT 编译可以带来明显的性能提升;而对于启动时间敏感或执行频率较低的场景,解释执行可能更为合适。
权衡选择:在实际应用中,可以根据具体需求和场景,选择合适的执行方式,或者结合两者的优点,采用混合执行策略,以达到最佳的性能和用户体验。
代码来源:rbpf虚拟机
鸣谢: qmonnet 提供的开源代码.
当然,我也会将带有中文注释和自己理解的一些代码上传的我的github页面,感兴趣的朋友可以进行clone查看.
我的GitHub:forked
感谢您的点赞、关注、收藏!