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

问题描述 投票:6回答:1

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

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

此问题最初由Oscar在JuliaLang Slack频道上提出

performance types julia
1个回答
5
投票

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

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

在朱莉娅的上行0.7+(特别是1.0)获得了所谓的小联盟优化。基本上是不稳定的,只有4种或更少的可能性。然后朱莉娅要好得多。而且由于很多不稳定性,只有2种情况。例如。返回值,如果找不到,则返回nothing。情况好多了。类型不稳定性的较小的并集优化级别仍然比完全类型稳定的代码差。但这要近得多。

© www.soinside.com 2019 - 2024. All rights reserved.