rbpf虚拟机-JIT和解释执行对比

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 该篇文章是记录rbpf虚拟机JIT执行和解释执行的速度对比。(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展。)

✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨
—— 专为开发者打造的宝藏基地,等你来探索!
这里有:


🔥 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
🎉 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
💎 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!


🚀 立即访问 → 盹猫猫的个人小站 ← 点击探索
🌟 说不定这里就有你寻找已久的技术秘籍哦~

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


目录
相关文章
|
5月前
|
区块链 数据安全/隐私保护 Python
小试牛刀-区块链WalletConnect协议数据解密
最近在学习如何使用Wallet Connect,查阅官方文档后,发现并没有太多的中文参考资料,英文直译读起来也有一些偏差,所以这边直接采用网页Demo的方式,对WC协议有了一定了解.在此进行记录,同时希望帮助到有实现相关功能的朋友.
305 4
|
5月前
|
存储 Java 区块链
Springboot应用开发:工具类整理
在实际的Springboot应用开发中,有很多类可作为工具类,这些类将实际开发中可能用到的重复性代码进行提取,方便在后续的开发中使用,在这里我对在开发中经常用到的工具类进行整理,方便自己之后查找,同时希望可以帮助到有实现相关功能的朋友。
266 1
|
5月前
|
存储 Java API
小试牛刀-SpringBoot集成SOL链
java工程师:如何在java/springboot中使用solana区块链呢?不用担心,现在solanaj来了!
168 0
|
5月前
|
Linux 开发者 Windows
告别手动上传!开源FTP批量同步工具(免费跨平台)​​
自己开发的一个简单实用的 FTP 文件夹同步工具,支持定时自动同步和系统托盘运行,免去繁琐的配置。
135 1
|
5月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
166 5
|
5月前
|
Python
小试牛刀-Python生成solana Wallet公私钥
在使用Python开发solana应用过程中,需要生成solana Wallet公私钥,以实现后续应用操作.这里将Python生成方法进行整理,方便日后的查阅,也能帮助到实现相关功能的朋友。
145 6
|
5月前
|
IDE Java 开发工具
IntelliJ IDEA 使用技巧与插件推荐
IntelliJ IDEA 是一个功能强大、扩展性丰富的开发工具。通过掌握常用的快捷键和技巧,结合合适的插件,可以大幅提升你的开发效率。
223 2
|
5月前
|
传感器 定位技术 数据格式
常用通信协议及数据格式
常用通信协议和格式总结
447 2
|
5月前
|
算法 区块链 数据安全/隐私保护
加密算法:深度解析Ed25519原理
在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。
519 1
|
5月前
|
缓存 Java 测试技术
高德?不,用自己的导航
编写该文章的目的是在开发时需要用到自定义的路网导航,查阅高德、百度地图等相关网站后,并没有发现可自定义路网的导航,后来在Git上搜到了Graphhopper这个国外的开源软件,然后学习使用后实现了自定义路网导航的功能,现在记录一下自己的实现过程,以保存开发资料,并且帮助到需要实现相关功能的朋友。
172 1