puerts / backend-quickjs

BSD 3-Clause "New" or "Revised" License
14 stars 11 forks source link

JSValue逃逸机制优化 #3

Closed chexiongsheng closed 2 years ago

chexiongsheng commented 2 years ago

之前的逃逸有两个问题: 1、如果在回调中,直接用Object把quickjs传来的值作为对象属性值设置给另外一个对象,会崩溃(目前unity和unreal倒无该场景); 2、链式操作访问属性,回收过快的问题,至少导致两个比较让人困惑的问题 https://github.com/Tencent/puerts/issues/118 https://github.com/Tencent/puerts/issues/780

chexiongsheng commented 2 years ago

quickjs基于引用计数,链式操作访问属性,立即释放是符合quickjs预期的。 修改前会立即释放的原因是以前的逃逸机制是添加到一个逃逸Set里头,并不会增加引用计数。所以立即释放。 而修改后,逃逸是通过ref_count++,scope销毁ref_count--实现。 而目前的js调用,并没有建立scope(v8是回调时建立一个默认的),所以那个对象在链式操作过后,仍然引用计数为1,等到整个脚本执行完备后,才一次性释放。 所以,这个逃逸机制本身并不能解决上述的问题2。因为那问题本来不是问题,如果像v8那样,回调建立默认的scope,也会立即回收。

chexiongsheng commented 2 years ago

记录下跟踪链式操作的释放问题时,发现的一些优化点 返回一个结构体,FindOrAddStruct会有三次可以优化的Isolate::Alloc:v8::External::New,v8::Boolean::New。本身有一次。 返回一个数字,现在v8::Number::New都会产生一次Isolate::Alloc 这些都可以考虑用类似v8的smi来优化