V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tool2d
V2EX  ›  Android

为什么同样是手机模拟 x86 windows, QEMU 和 ExaGear 性能差距如此之大?

  •  1
     
  •   tool2d · 2022-10-08 09:25:40 +08:00 · 8603 次点击
    这是一个创建于 559 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 B 站看到测评,有人用 ExaGear 运行街霸 4 PC 版,很完美,心想那么多年过去了,QEmu 也应该有长足进步。

    https://www.bilibili.com/video/BV1pL411P71L/

    于是昨晚测试了一下,结果大跌眼镜,别说硬件加速的游戏了,正常软件都卡的不行,几分钟启动 windows ,勉强打开 chrome ,完全没有用户体验,和 ExaGear 基本一个天,一个地。

    跑了一下 SuperPI CPU 测试,同一台手机上,ExaGear 运行只需要 1 分钟,而 QEMU 2022 年开了最强 JIT 加速 TCG 后,需要 20 分钟,几乎有 20 倍的差距。

    31 条回复    2022-10-09 18:22:45 +08:00
    xuan_lengyue
        1
    xuan_lengyue  
       2022-10-08 09:45:13 +08:00
    一个是 WINE ,一个是模拟器,肯定不一样的。
    有些 QEMU 能做的事 WINE 做不了。
    tool2d
        2
    tool2d  
    OP
       2022-10-08 09:52:04 +08:00
    @xuan_lengyue 不是啊,ExaGear 转译 x86 指令又不是 Wine 负责。

    Wine 只是能翻译 windows Api ,比如 D3D ,让其以更快的速度运行。
    podel
        3
    podel  
       2022-10-08 10:07:02 +08:00
    很多 Windows API 都能转成 ARM 原生指令集?
    tool2d
        4
    tool2d  
    OP
       2022-10-08 10:15:22 +08:00
    @podel ExaGear 有两个模块,一个是把 x86 指令转成 arm 指令。

    另一个模块是 wine ,负责模拟 windows api 环境。后者和 ExaGear 关系不大,是开源社区在维护的。

    也不是所有指令都能翻译,游戏用到了 AVX 指令就没办法翻译了。
    edimetia3d
        5
    edimetia3d  
       2022-10-08 10:16:03 +08:00
    mark. 我也很好奇. 有没有了解的同学?

    感觉 qemu 应该是一个虚拟机, 会有一个 loop 来 dispatch instruction?
    exagear 这样的方案应该是动态转译指令,然后直接 JIT 的用 native CPU 来跑?
    0o0O0o0O0o
        6
    0o0O0o0O0o  
       2022-10-08 10:18:27 +08:00 via iPhone
    关于为什么比 QEMU 快,应该能在这里找到一些看起来合理的类似产品的解释:
    https://www.zhihu.com/question/48522805

    至于 Android 上的 QEMU 如何快起来应该可以看这里:
    https://twitter.com/kdrag0n/status/1492712401262710784
    podel
        7
    podel  
       2022-10-08 10:21:04 +08:00
    ExaGear 应该跟 ARM 版本的 Windows 10/11 差不多。
    正常的程序 其实内部有很多的 Windows 系统调用的。
    直接 QEMU 的话,所有的 Windows API 都是 ARM 模拟的所以慢。
    但是一部分 计算用翻译,WIN API 换成原生 ARM 这样速度就会快很多。
    速度上 应该是 原生 X86WIN > Windows on ARM >= ExaGear > 纯 QEMU
    mxT52CRuqR6o5
        8
    mxT52CRuqR6o5  
       2022-10-08 11:15:07 +08:00
    qemu 里跑 superpi ,隔着一层操作系统,我对 jit 能做到多少效果表示怀疑
    ExaGear 里跑的话,理论上 jit 可以直接感知到程序,能更好的 jit
    ysc3839
        9
    ysc3839  
       2022-10-08 13:04:09 +08:00 via Android
    你测试 qemu 是跑完整系统?没有经过 Wine ?那没有可比性呀,都没做到控制变量。
    Red54
        10
    Red54  
       2022-10-08 14:10:31 +08:00
    ExaGear 没有运行完整系统,要对比的话应该用 QEMU 的用户模式( User Mode )运行 X86 的 WINE 来对比。
    flynaj
        11
    flynaj  
       2022-10-08 14:41:44 +08:00   ❤️ 1
    qemu TCG 是最慢的 性能顺序 kvm, xen, hax, hvf, nvmm, whpx ,tcg
    tool2d
        12
    tool2d  
    OP
       2022-10-08 15:24:32 +08:00
    @ysc3839 昨晚测试的时候,用 Qemu 跑了三个 x86 系统,分别是 WinPE, TinyCoreLinux, WinXP 。

    其中 WinXP 速度最快,Linux 最慢,原因不明。因为运行实在太慢,就没进一步测试 wine 了。

    感觉 super pi 就是浮点运算,也没涉及太多的图形和系统 API ,所以觉得 wine 这个变量影响应该不会太大。
    tool2d
        13
    tool2d  
    OP
       2022-10-08 15:26:28 +08:00
    @flynaj 我不开 TCG ,裸奔速度更慢。开了至少快那么一丢丢。

    谁能给一个能运行的 arm 版本 qemu-kvm 就好了。
    7c00
        14
    7c00  
       2022-10-08 16:14:08 +08:00
    我这里提供一个案例,termux 里跑 solc 编译任务。

    原生不到 100ms:


    qemu user mode 运行 x86 要 800ms:
    7c00
        15
    7c00  
       2022-10-08 16:23:59 +08:00
    这是 fish 的 time ,看走眼了,原生是 200 多 ms ,看起来差距也不是特别大
    kkocdko
        16
    kkocdko  
       2022-10-08 17:07:57 +08:00
    也许可以推断出楼主对现代虚拟化技术栈很不熟悉。
    tool2d
        17
    tool2d  
    OP
       2022-10-08 18:11:16 +08:00
    @7c00 我也试了一下用 usermode 来运行 superpi, 从结果来看,x86 elf 运行速度比 windows exe 还要慢。

    看来 qemu 的 system mode 和 user mode 区别,仅仅只是环境而已。

    而且 usermode 不能启用 tcg 加速?那真的是裸奔上阵,超勇。

    secondwtq
        18
    secondwtq  
       2022-10-08 22:21:02 +08:00
    不建议只跑一个 benchmark 。
    zhhww57
        19
    zhhww57  
       2022-10-09 01:02:20 +08:00
    是用的 qemu-static-i386? 你试试看这样,本地运行个 x server ,然后用 qemu-static-i386 运行一下 x86 的 wine ,图形界面会连 x server ,测一下
    Red54
        20
    Red54  
       2022-10-09 11:04:07 +08:00
    Red54
        21
    Red54  
       2022-10-09 11:06:23 +08:00
    tool2d
        22
    tool2d  
    OP
       2022-10-09 11:34:30 +08:00
    @Red54 你这好像不是 qemu 呢,是手机内部直接转译的吧?类似安卓 x86 电脑模拟器运行 arm 程序一样。
    Red54
        23
    Red54  
       2022-10-09 12:06:30 +08:00
    @tool2d 我这是 ARM 服务器,用的就是 QEMU 用户模式,我没见过哪台 ARM 手机集成有 X86 转译的。
    tool2d
        24
    tool2d  
    OP
       2022-10-09 12:31:38 +08:00
    @Red54 贴图看起来 arm 服务器效率很好,性能基本和 exagear 持平了。

    不知道是不是我调用的 qemu-i386 elf 姿势的问题,在安卓手机上巨慢。
    Red54
        25
    Red54  
       2022-10-09 14:12:24 +08:00


    顺便测试一下 QEMU 用户模式运行 RISC-V ( riscv64 )、PowerPC ( ppc64el )和 S/390 ( s390x )的性能。
    tool2d
        26
    tool2d  
    OP
       2022-10-09 14:22:40 +08:00
    @Red54 强烈怀疑这台机器配置了 arm 版本的 kvm ,你看看有没有 /sys/module/kvm 目录呢?

    用户模式运行速度也太快了。

    我用别人编译版本的 qemu-i386 ,什么加速参数都加不了,就非常卡顿。
    Red54
        27
    Red54  
       2022-10-09 14:41:29 +08:00
    @tool2d QEMU 用户模式与 KVM 无关,看来这位老哥 @kkocdko 说得对,你对虚拟化不是很熟悉。
    tool2d
        28
    tool2d  
    OP
       2022-10-09 15:08:58 +08:00
    @Red54 QEMU 的纯 CPU 软件模式能跑那么快?我不信啊。

    一点没硬件加速的 QEMU ,运行比蜗牛还慢。但是只有 KVM/HAXM ,那就是本质的飞跃。

    近期有国产的 ARM 芯片,就是用到了 KVM ,理论上速度应该和你贴图差不多。
    tool2d
        29
    tool2d  
    OP
       2022-10-09 17:21:35 +08:00
    @Red54 我是骁龙 870 安卓平板,正常计算 pi ,速度很快。

    但为什么一调用 qemu 用户模式,计算速度就异常缓慢呢?

    5 倍速度之内我才能接受,这也太慢了吧,运行 1 秒变成了 45 秒。


    kkocdko
        30
    kkocdko  
       2022-10-09 17:58:55 +08:00
    @Red54 流行的几款移动端 ARM 芯片似乎都阉割了很多虚拟化特性,完整 KVM 支持应该只有 Google Tensor ?我记不清了。

    总之我觉得这帖子下面有很多讨论都是风马牛不相及。建议楼主可以搜一下相关资料,先对各种概念一个初步的认识之后,再去探索。而不是这样一股脑使劲实验然后瞎猜。
    tool2d
        31
    tool2d  
    OP
       2022-10-09 18:22:45 +08:00
    @kkocdko 实验出来的,才是真理啊。

    我对 qemu 还是很有好感的,加了 kvm 的 linux host 运行飞快,加了 hax 的 window host 运行飞快,唯独加了 tcg 的 android host ,卡到不能自理。

    至于用户模式我也无感,就暂且当一个动态 JIT 吧,但我主要目的还是运行 EXE ,没 DX 环境模拟也没戏。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1299 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 17:40 · PVG 01:40 · LAX 10:40 · JFK 13:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.