Tencent / puerts

PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[UE] 我想咨询下一下关于 JIT 的问题

hewenning opened this issue · comments

Detail | 详细描述

我想问下关于现有版本的 Puerts,有做过相关的 JIT 的性能基准测试么?
我想在项目中尝试一下 JIT,有什么相关的开启的办法么?

struct JitCodeEvent {
enum EventType {
CODE_ADDED,
CODE_MOVED,
CODE_REMOVED,
CODE_ADD_LINE_POS_INFO,
CODE_START_LINE_INFO_RECORDING,
CODE_END_LINE_INFO_RECORDING
};
// Definition of the code position type. The "POSITION" type means the place
// in the source code which are of interest when making stack traces to
// pin-point the source location of a stack frame as close as possible.
// The "STATEMENT_POSITION" means the place at the beginning of each
// statement, and is used to indicate possible break locations.
enum PositionType { POSITION, STATEMENT_POSITION };

// There are two different kinds of JitCodeEvents, one for JIT code generated
// by the optimizing compiler, and one for byte code generated for the
// interpreter. For JIT_CODE events, the |code_start| member of the event
// points to the beginning of jitted assembly code, while for BYTE_CODE
// events, |code_start| points to the first bytecode of the interpreted
// function.
enum CodeType { BYTE_CODE, JIT_CODE };
我看 v8.h 中有相关的代码,有做过相关的尝试么

默认就打开jit。
只有在不允许jit的系统才关闭jit,比如ios。
能开的我都开了,不能开你也开不了。

我有几个问题想咨询下:

  • 如何判定的代码是不是被 JIT 了呢
  • 如何让代码尽量 JIT 呢

我有几个问题想咨询下:

  • 如何判定的代码是不是被 JIT 了呢
  • 如何让代码尽量 JIT 呢

判定有没jit也没用,你也没法干涉。
怎么让它尽量被jit编译倒有很多文章,一搜索一大把,搜chrome,v8,node的都有。
其实有没jit也不一定很关键。ios下不能jit,也不妨碍大多数ios的应用、游戏表现不差于android甚至更好。
写好你自己的代码,一些低级错误、低效算法比jit影响更大。

目前业务这边优化也在同步进行中,感谢回答,我们目前是 PC 端游戏,内存也不是敏感点,所以如果可以降低一下基础消耗的话还是希望可以尝试下

参考这篇文章,
https://glebbahmutov.com/blog/detecting-function-optimizations-in-v8/
以及这个库:
https://github.com/NathanaelA/v8-Natives/blob/master/README.md

v8有一些语法可以让js来控制jit(需要打开 -allow-natives-syntax,并且是v8 backend only)。

和你的需求比较有关的是:

  • %getOptimizationStatus: 查询一个函数是否被Jit
  • %optimizeFunctionOnNextCall: 要求一个函数在下次调用的时候被jit

十分感谢,我会看下相关的资料做相关处理

个人建议无需太过关注能不能jit。
我曾经想搞js的aot,当时和一个70%代码是ts实现的项目做了个测试:测试关闭jit和打开jit的性能差距,看AOT值不值得做。
结果发现关闭jit帧率没影响。
而另外一个已经上线的,90%代码是ts的项目反馈,deoptimization对性能的影响更大,脚本代码写得不合理会反复的jit、deoptimization,反复jit编译的开销严重影响性能。

我们项目,在安卓上面,关闭和开启Jit对比:关闭Jit,平均帧率会下降,但是Jank会减少;开启Jit,平均帧率上升,Jank会增加(就是上面说的deoptimization的影响)

其实你在能Jit的平台(Win/Android),通过增加--jitless的V8 Flag选项,就能测试没有Jit时候的性能了