我很好奇,如果您的代码中存在类型不稳定性,到底是什么严重影响了性能?
此问题最初由Oscar在JuliaLang Slack频道上提出
一个主要因素是类型不稳定性会导致动态调度,在这种情况下,语言需要锻炼在运行时需要调用哪种方法(对于某些函数,类型为不稳定变量)。在静态情况下,它将编译为直接函数调用(基本上是机器代码中的goto语句)。但是对于不稳定的代码,它必须具有读取该函数所有方法列表并找到匹配方法的代码。动态调度还意味着它不能内联,这极大地限制了优化器。
一个特殊的问题是类型不稳定是有毒的,例如不限于它发生的位置。因此,您可以将紧密循环变成在每个操作中进行动态分配的循环
在朱莉娅的上行0.7+(特别是1.0)获得了所谓的小联盟优化。基本上是不稳定的,只有4种或更少的可能性。然后朱莉娅要好得多。而且由于很多不稳定性,只有2种情况。例如。返回值,如果找不到,则返回nothing
。情况好多了。类型不稳定性的较小的并集优化级别仍然比完全类型稳定的代码差。但这要近得多。