类型不稳定性如何会严重损害性能呢?

Lyn*_*ite 6 performance types julia

我很好奇,如果您的代码中存在类型不稳定性,到底是什么严重影响了性能?

  • 从字面上看是否需要在运行时执行类型检查,我想在我脑海中是一堆if / else语句(如果Float64 ... elseif Int64 elseif Float32 ...等)
  • 和/或类型检查是否阻止CPU在循环中进行流水线处理?
  • 还是主要的问题是对于类型不稳定变量类型的所有操作都会发生堆分配?
  • 或者是其他东西?
  • 任何见解或链接到进一步的资源将不胜感激。

这个问题最初是由Oscar在JuliaLang Slack频道上提出的

Lyn*_*ite 5

一个主要因素是类型不稳定性会导致动态调度,在这种情况下,语言需要锻炼在运行时需要调用哪种方法(对于某些函数,类型为不稳定变量)。在静态情况下,它将编译为直接函数调用(基本上是机器代码中的goto语句)。但是对于不稳定的代码,它必须具有读取该函数所有方法列表并找到匹配方法的代码。动态分派还意味着它不能内联,这极大地限制了优化程序的功能。

一个特殊的问题是类型不稳定性是有毒的,例如不限于其发生的位置。因此,您可能会将紧密的循环变成在每个操作中进行动态分配的循环。

但是,在Julia 1.x中,编译器可以执行“小并集优化”,这意味着,如果编译器确定某个值必须为一小部分具体类型(当前为4),则可以,而不是进行动态处理。调度,检查实际类型是否为这四种可能性中的任何一种,并生成一个分支,在该分支中可以知道值的具体类型,并且可以完全避免动态调度。例如,如果一个值可以是an Intnothing则编译器可以检查是否为,nothing并处理该情况,否则它知道该值必须为an Int,并且可以为该情况生成有效的代码。