Lyn*_*ite 6 performance types julia
我很好奇,如果您的代码中存在类型不稳定性,到底是什么严重影响了性能?
这个问题最初是由Oscar在JuliaLang Slack频道上提出的
一个主要因素是类型不稳定性会导致动态调度,在这种情况下,语言需要锻炼在运行时需要调用哪种方法(对于某些函数,类型为不稳定变量)。在静态情况下,它将编译为直接函数调用(基本上是机器代码中的goto语句)。但是对于不稳定的代码,它必须具有读取该函数所有方法列表并找到匹配方法的代码。动态分派还意味着它不能内联,这极大地限制了优化程序的功能。
一个特殊的问题是类型不稳定性是有毒的,例如不限于其发生的位置。因此,您可能会将紧密的循环变成在每个操作中进行动态分配的循环。
但是,在Julia 1.x中,编译器可以执行“小并集优化”,这意味着,如果编译器确定某个值必须为一小部分具体类型(当前为4),则可以,而不是进行动态处理。调度,检查实际类型是否为这四种可能性中的任何一种,并生成一个分支,在该分支中可以知道值的具体类型,并且可以完全避免动态调度。例如,如果一个值可以是an Int
,nothing
则编译器可以检查是否为,nothing
并处理该情况,否则它知道该值必须为an Int
,并且可以为该情况生成有效的代码。