我正在审查一份涉及JIT内联语义的会议演示文稿,作者指出了奇怪的行为(当然,只是乍一看很奇怪)- C2比C1慢,因为它由于过多的内联深度而无法内联方法。这可以用以下示例表示:
public static int multipleByTwo(int x) {
return x * 2;
}
public static void entrypoint() {
int sum = 0;
for (int i = 0; i < 10_000_000; i++) {
// due to some arbitrary cause, multiplyByTwo doesn't get inlined
sum += multiplyByTwo(i);
}
}
作为一名程序员,我可能知道编译器不知道的优化领域。例如,如果强制将
multiplyByTwo
内联,那么有很多优化可能性,但由于各种限制(例如方法大小或内联深度),它可能被省略。为什么没有办法告诉编译器“嘿,我非常确定你应该更喜欢内联这个方法而不是其他的”?我相信我不是第一个想到这个问题的人,也有关于不实现这个功能的讨论 - 为什么呢?附注:请注意,我谈论的是提示而不是指令;我明白后者的选择会带来更多的伤害而不是好处。