633e99c3da6230c8da867f28e8bc47a8ba805e10
Task #59's idea was that __dynamic_cast - 49% of all shim crossings, called
3x more often by native than this engine can serve (task #58) - could run as
emulated ARM32 instead, since it only reads guest memory and needs nothing
from the host. Emulated-but-not-crossing would then beat
native-but-crossing.
It is implemented, correct, and does remove the crossings. It also makes no
measurable difference to load time.
Interleaved A/B, one run per build, alternating to cancel device drift:
fast path ON 40.67 / 41.13 / 40.98 mean 40.93s
fast path OFF 41.35 / 40.52 / 41.46 mean 41.11s
0.18s apart with fully overlapping spreads. Noise.
THE RESULT THAT MATTERS IS THE NEGATIVE ONE: shim-crossing COUNT is not what
paces loading. Three separate findings now say this and were previously read
as three unrelated disappointments - removing 17 probe hooks bought nothing
(#48), cheapening the crossing bought ~3% (9c4a455), and removing ~41% of all
crossings buys nothing here. That closes a whole line of optimisation.
Kept behind kEnableGuestFastPath, default OFF: it is real added complexity
(hand-assembled guest Thumb, a second registration name, an executable-memory
allocator) for no measured gain, and a wrong dynamic_cast corrupts state
silently rather than crashing. The measurement and the infrastructure are
worth keeping; the behaviour change is not worth defaulting on.
Two things found along the way that ARE keepers:
- AllocGuestCode(): AllocPermanent carves from the control arena, which is
mapped read-write only since task #54, so code placed there faults
immediately with FETCH_PROT at its own entry address. Making the control
arena executable to accommodate it cost a measured ~4s. AllocGuestCode
carves from the trampoline arena, which is already executable and is not
write-hot. Anything generating guest code must use it.
- Device drift is large enough to invalidate cross-session comparisons: the
identical build that measured 35.20s earlier today measured 41.11s a few
hours later. Only interleaved A/B within one sitting is trustworthy. Three
near-miss wrong conclusions today traced back to comparing against a stale
baseline.
Co-Authored-By: Claude <noreply@anthropic.com>
Description
Мод добавляющий мультиплеер для NFSMW
17 MiB
Languages
C++
48%
Java
46.1%
Kotlin
4.4%
C
1%
Shell
0.3%
Other
0.2%