inline cache技巧
19 Feb 2021
|
|
鸽了
在动态语言中,这是一种加速手段,用于快速找到类型原型(存一份)
以这篇文章的例子作为参考
function getX(o) {
return o.x;
}
这段代码的字节码是
get_by_id loc0, arg1, x
return loc0
大意是拿到参数1 arg1存到loc0地址并且加载x,然后返回地址
inline cache究竟cache了什么?在对象的元信息,比如字段,字段的便宜这些概念抽象出一个shape的概念,cache的就是shape
json本身是不保存shape的,有另外的映射
那比如{x:'a'}
这种简单的参数,第一次传,get_by_id就cache一下这种类型,x偏移是0,下次再来调用,对比shape相同,就不用算偏移了,直接命中
再举一个例子
一个inline cache的使用
typedef unsigned char byte;
#define STACK_SIZE 100
typedef struct {
Object* stack_array[STACK_SIZE];
Object** stack;
Code* code;
int pc;
} Frame;
void eval_code_uncached(Code* code, Object** args, int nargs) {
Frame frame;
init_frame(&frame, code);
while (true) {
Opcode op = code->bytecode[frame.pc];
byte arg = code->bytecode[frame.pc + 1];
switch (op) {
case ARG:
CHECK(arg < nargs && "out of bounds arg");
push(&frame, args[arg]);
break;
case ADD: {
Object* right = pop(&frame);
Object* left = pop(&frame);
Method method = lookup_method(object_type(left), kAdd);
Object* result = (*method)(left, right);
push(&frame, result);
break;
}
case PRINT: {
Object* obj = pop(&frame);
Method method = lookup_method(object_type(obj), kPrint);
(*method)(obj);
break;
}
case HALT:
return;
default:
fprintf(stderr, "unknown opcode %d\n", op);
abort();
}
frame.pc += kBytecodeSize;
}
}
这里的lookup_method
参考链接
- https://zhuanlan.zhihu.com/p/38202123
- Pyston https://blog.pyston.org/2016/06/30/baseline-jit-and-inline-caches/
- 这里展示了一个inline cache实现https://bernsteinbear.com/blog/inline-caching/
- https://bernsteinbear.com/blog/small-objects/
- https://blog.csdn.net/sinat_39956944/article/details/105165074