算法与预编译参考实现的速度比因计算机而异 我们有一个具有以下架构的小型C++项目。

算法与预编译参考实现的速度比因计算机而异 我们有一个具有以下架构的小型C++项目。,c++,performance,dll,shared-libraries,C++,Performance,Dll,Shared Libraries,这两个文件被编译成DLL: 算法 算法测试仪,用于检查结果的正确性并测量执行速度 然后,同一算法的另一个实现由其他人编写 main()函数执行以下操作: 在算法的两个实现上调用tester并测量它们的执行速度。这要做几次,以便以后可以取平均值 计算它们之间的速度比(测量时间/测量参考时间)。这被称为分数 我们发现,在不同的计算机上运行相同的代码和DLL会返回完全不同的速度比。在一台计算机上,一个实现得6.4分,而在另一台计算机上,同一个实现得2.8分。这怎么可能呢?可能有很多因素,但这里

这两个文件被编译成DLL:

  • 算法
  • 算法测试仪,用于检查结果的正确性并测量执行速度
然后,同一算法的另一个实现由其他人编写

main()
函数执行以下操作:

  • 在算法的两个实现上调用tester并测量它们的执行速度。这要做几次,以便以后可以取平均值
  • 计算它们之间的速度比(测量时间/测量参考时间)。这被称为分数

我们发现,在不同的计算机上运行相同的代码和DLL会返回完全不同的速度比。在一台计算机上,一个实现得6.4分,而在另一台计算机上,同一个实现得2.8分。这怎么可能呢?

可能有很多因素,但这里有几个:

  • CPU缓存可能很大。不同的处理器具有不同的缓存(不仅在原始缓存大小方面,而且在缓存策略方面)。一个可能比另一个“聪明”,或者在这种特定情况下,一个恰好比另一个工作得更好
  • CPU流水线。现在的指令在CPU中是交错的,甚至在单个执行线程中也是如此。CPU管道的工作方式因CPU而异,一个CPU可以同时处理两个特定的事情,而另一个CPU不能。如果其中一个实现利用了这一点,那么它就会获得速度提升(或者如果它们都这样做,那么它们都会接近相同的速度)
  • CPU指令执行时间可能会有所不同。因此,一个CPU执行与另一个CPU完全相同的指令可能比另一个CPU执行每一条指令的速度更快。如果一台计算机的CPU使用特定指令所需的时间较长(其中一个实现恰好使用该指令),而另一台CPU经过改进以加快该指令的执行时间,则时间差异会更大
  • CPU中的分支预测模型可能不同,一个实现可能或多或少对特定CPU的分支预测模型友好
  • 操作系统可以通过多种方式影响这一点,从内存分配策略(可能一个操作系统的内存分配策略会导致更大的时间差异,而另一个操作系统的内存分配策略会使差异最小化)到CPU时间片管理(例如,算法是多线程的吗?)

“算法与预编译参考实现的速度比在不同的计算机上有所不同”-是的,这就是非程序员所说的“现实生活”。你为什么期望(大致)相同?计算机在各种或多或少微妙的方面都不同。例如,考虑一个基本算法A和一个更广泛的缓存算法B,需要额外的内存。在系统1上,两者都适合可用的RAM,而在系统2上,算法B开始交换,速度减慢到爬行速度。如果计算机中的处理器来自不同的供应商,或者来自同一供应商产品的不同代,那么您可能会在每一代上遇到不同的体系结构瓶颈。例如,在某些处理器上,间接分支(即通过函数指针进行分支)比其他处理器更昂贵。此外,缓存布局和策略的差异也会产生影响。如果一个处理器有AVX,而另一个处理器只有SSE,则会产生影响,等等。