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

2022-10-08 09:25:40 +08:00
 tool2d
在 B 站看到测评,有人用 ExaGear 运行街霸 4 PC 版,很完美,心想那么多年过去了,QEmu 也应该有长足进步。

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

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

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

8880 次点击
所在节点    Android
31 条回复
xuan_lengyue
2022-10-08 09:45:13 +08:00
一个是 WINE ,一个是模拟器,肯定不一样的。
有些 QEMU 能做的事 WINE 做不了。
tool2d
2022-10-08 09:52:04 +08:00
@xuan_lengyue 不是啊,ExaGear 转译 x86 指令又不是 Wine 负责。

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

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

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

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

至于 Android 上的 QEMU 如何快起来应该可以看这里:
https://twitter.com/kdrag0n/status/1492712401262710784
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
2022-10-08 11:15:07 +08:00
qemu 里跑 superpi ,隔着一层操作系统,我对 jit 能做到多少效果表示怀疑
ExaGear 里跑的话,理论上 jit 可以直接感知到程序,能更好的 jit
ysc3839
2022-10-08 13:04:09 +08:00
你测试 qemu 是跑完整系统?没有经过 Wine ?那没有可比性呀,都没做到控制变量。
Red54
2022-10-08 14:10:31 +08:00
ExaGear 没有运行完整系统,要对比的话应该用 QEMU 的用户模式( User Mode )运行 X86 的 WINE 来对比。
flynaj
2022-10-08 14:41:44 +08:00
qemu TCG 是最慢的 性能顺序 kvm, xen, hax, hvf, nvmm, whpx ,tcg
tool2d
2022-10-08 15:24:32 +08:00
@ysc3839 昨晚测试的时候,用 Qemu 跑了三个 x86 系统,分别是 WinPE, TinyCoreLinux, WinXP 。

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

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

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

原生不到 100ms:


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

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

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

secondwtq
2022-10-08 22:21:02 +08:00
不建议只跑一个 benchmark 。
zhhww57
2022-10-09 01:02:20 +08:00
是用的 qemu-static-i386? 你试试看这样,本地运行个 x server ,然后用 qemu-static-i386 运行一下 x86 的 wine ,图形界面会连 x server ,测一下
Red54
2022-10-09 11:04:07 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885143

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX