5 java performance code-organization
我发现C++编译器这样做但我想知道Java编译器是否也这样做,因为在那个答案中他们说添加静态会这样做但是静态在java和C++中是不同的.在我的情况下表现会重要,因为我使用被称为每帧只有一次在一场比赛中循环,并呼吁无处功能,使其更易于阅读
在我的代码我有它设置了与此类似,只是多了很多电话
while(running)
{
update();
sync();
}
Run Code Online (Sandbox Code Playgroud)
然后update(),render()会调用更多调用其他方法的方法
private final void update()
{
switch(gameState)
{
case 0:
updateMainMenu();
renderMainMenu();
break;
case 1:
updateInGame();
renderInGame();
break;
//and so on
}
}
private final void updateInGame()
{
updatePlayerData();
updateDayCycle();
//and so on
}
private final void updatePlayerData()
{
updateLocation();
updateHealth();
//and so on
}
Run Code Online (Sandbox Code Playgroud)
那么编译器是否会内联这些函数,因为它们只在同一位置每帧使用一次?
如果这是一个不好的问题,请告诉我,我将删除它.
Java JITC 将尝试内联出现(基于运行时统计)的任何函数,以使其经常被调用以使其值得调用。函数是在一个地方还是在几十个地方被调用都没有关系——每个调用站点都是单独分析的。
请注意,该决定基于几个因素。该方法有多大是一种 - 如果有很多潜在的内联候选者,只有最有利可图的将被内联,以避免“代码膨胀”。但是通话频率(乘以通话的感知费用)是最大的“得分”因素。
不鼓励内联的一件事是明显的多态调用。如果调用可能是多态的,则必须由代码“保护”,如果到达的类不是预期的类,则将执行原始调用。如果统计数据证明调用经常是多态的(并且包括所有多态变体是不值得的),那么内联可能没有足够的利润。静态或最终方法是最有吸引力的,因为它不需要保护。
另一件可以阻止内联(和许多其他东西)的事情是,奇怪的是,从方法返回失败。如果您输入了一个方法,然后在内部循环了 1000 万次而不返回,则 JITC 永远不会有机会“换出”已解释的方法并“换入”已编译的方法。但是 JITC 通过使用只编译方法的一部分的技术在一定程度上克服了这一点,而其余部分则被解释。