为什么在"Hackerrank"站点上执行代码所需的时间差异很大?



当您在www.hackerrank.com上尝试一些编码挑战并跟踪时间时(例如,在C++中使用"chrono"库(,您会发现每次运行代码时,在完全相同的代码上执行所需的时间不同。我估计方差为10%到30%。在相同的代码下,代码执行时间变化很大的原因是什么?是什么因素造成的?

它可以是服务器系统;但是否存在物理原因(电子元件中的随机过程(?

几乎可以肯定,这只是一个繁忙的系统,您的进程与其他进程竞争CPU时间。(即使自己有CPU,也会争夺内存带宽(。


此外,服务器可能在具有SMT(同时多线程(的CPU上运行,SMT将每个物理内核用作两个逻辑内核,因此进程竞争的"共享执行资源"包括单个CPU内核内的内容,而不仅仅是三级缓存和内存带宽。

英特尔称他们的SMT技术为"超线程";现在大多数服务器都运行在Intel Xeon CPU上。AMD Zen也使用SMT,所以无论哪种方式,除非服务器管理员禁用它,否则当操作系统将任务调度到单个物理核心的两个逻辑核心上时,它们会互相减慢一些速度(减慢的幅度主要取决于它们的平均IPC(每个周期的指令(——两个有很多分支预测错误的线程通常不会看到太多的速度减慢(因此吞吐量几乎翻了一番(。但是,两个线程本身都可能使FP乘法器ALU几乎饱和,每个线程将以几乎一半的速度运行(吞吐量几乎为零(。

操作系统"了解"SMT/超线程,可以检测哪些逻辑核心共享一个物理核心。它们试图避免将线程调度到同一个物理核心,同时存在一些两个线程都空闲的物理核心。

另请参阅现代微处理器90分钟指南!它涵盖SMT,具有了解共享哪些执行资源的背景。


但是否存在物理原因(电子元件中的随机过程(?

否,CPU是确定性的(除了使用真实模拟电噪声作为随机源的rdrand指令(。

CPU确实使用动态电压和频率缩放来节省功率(空闲与最大涡轮,或者如果热限制不允许最大涡轮,则介于两者之间。(https://en.wikipedia.org/wiki/Intel_Turbo_Boost/https://en.wikipedia.org/wiki/Dynamic_frequency_scaling

另请参阅绩效评估的惯用方法?以获得更多的微镶嵌陷阱/预热效果

最新更新