ObjectOperator 对比 v8 LookupIterator
测试用例
let obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4',
key5: 'value5',
key7: {
subkey1: 'subvalue1',
subkey2: 'subvalue2'
}
}
let obj1 = {
okey1: 'ovalue1',
okey2: 'ovalue2',
okey3: 'ovalue3',
}
obj1.__proto__ = obj;
let obj2 = {
pkey1: 'pvalue1',
pkey2: 'pvalue2',
}
obj2.__proto__ = obj1;
let start = Date.now();
for (let i = 0; i < 1e6; i++) {
Reflect.get(obj2, 'key1');
}
let end = Date.now();
print(end - start);
fastpath (IR路径)与 v8 持平
改造 reflect.get 测试 slowpath 差距 1.6 倍左右 (40ms / 70ms)
差距1:op 结果读取
我们通过各种 if 分支判断 op 的查询结果,v8 通过 it->state 判断,实测在上述简单场景中 if 分支的判断开销在 5ms 左右 (70ms -> 65ms)

差距2:NOT_FOUND cache
v8 的 properties cache 会对于 NOT_FOUND 场景做缓存,在遍历原型链的场景中,前几次查询找不到,我们这边没有缓存每次都重新 search
