算法与预编译参考实现的速度比因计算机而异 我们有一个具有以下架构的小型C++项目。
这两个文件被编译成DLL:算法与预编译参考实现的速度比因计算机而异 我们有一个具有以下架构的小型C++项目。,c++,performance,dll,shared-libraries,C++,Performance,Dll,Shared Libraries,这两个文件被编译成DLL: 算法 算法测试仪,用于检查结果的正确性并测量执行速度 然后,同一算法的另一个实现由其他人编写 main()函数执行以下操作: 在算法的两个实现上调用tester并测量它们的执行速度。这要做几次,以便以后可以取平均值 计算它们之间的速度比(测量时间/测量参考时间)。这被称为分数 我们发现,在不同的计算机上运行相同的代码和DLL会返回完全不同的速度比。在一台计算机上,一个实现得6.4分,而在另一台计算机上,同一个实现得2.8分。这怎么可能呢?可能有很多因素,但这里
- 算法
- 算法测试仪,用于检查结果的正确性并测量执行速度
main()
函数执行以下操作:
- 在算法的两个实现上调用tester并测量它们的执行速度。这要做几次,以便以后可以取平均值
- 计算它们之间的速度比(测量时间/测量参考时间)。这被称为分数
我们发现,在不同的计算机上运行相同的代码和DLL会返回完全不同的速度比。在一台计算机上,一个实现得6.4分,而在另一台计算机上,同一个实现得2.8分。这怎么可能呢?可能有很多因素,但这里有几个:
- CPU缓存可能很大。不同的处理器具有不同的缓存(不仅在原始缓存大小方面,而且在缓存策略方面)。一个可能比另一个“聪明”,或者在这种特定情况下,一个恰好比另一个工作得更好
- CPU流水线。现在的指令在CPU中是交错的,甚至在单个执行线程中也是如此。CPU管道的工作方式因CPU而异,一个CPU可以同时处理两个特定的事情,而另一个CPU不能。如果其中一个实现利用了这一点,那么它就会获得速度提升(或者如果它们都这样做,那么它们都会接近相同的速度)
- CPU指令执行时间可能会有所不同。因此,一个CPU执行与另一个CPU完全相同的指令可能比另一个CPU执行每一条指令的速度更快。如果一台计算机的CPU使用特定指令所需的时间较长(其中一个实现恰好使用该指令),而另一台CPU经过改进以加快该指令的执行时间,则时间差异会更大
- CPU中的分支预测模型可能不同,一个实现可能或多或少对特定CPU的分支预测模型友好
- 操作系统可以通过多种方式影响这一点,从内存分配策略(可能一个操作系统的内存分配策略会导致更大的时间差异,而另一个操作系统的内存分配策略会使差异最小化)到CPU时间片管理(例如,算法是多线程的吗?)