我正在创建一个元胞自动机,并对代码进行性能测试。
我是这样做的:
while True:
time_1 = perf_counter_ns()
numpy.fnc1()
time_2 = perf_counter_ns()
numpy.fnc2()
time_3 = perf_counter_ns()
numpy.fnc3()
time_4 = perf_counter_ns()
numpy.fnc4()
time_5 = perf_counter_ns()
numpy.fnc5()
time_6 = perf_counter_ns()
numpy.fnc6()
time_7 = perf_counter_ns()
diff_1 = time_2 - time_1
diff_2 = time_3 - time_2
diff_3 = time_4 - time_3
diff_4 = time_5 - time_4
diff_5 = time_6 - time_5
diff_6 = time_7 - time_6
print(results)
但是,我发现运行时有些不一致。我做了一些更长的测试,大约8个小时。
似乎表演是“跳来跳去”:一个小时它跑得更快,然后更慢,在这一个小时内有更小的部分,当它更快,然后它更慢...
更令人不安的是,慢-快周期的长度随着时间的推移而延长。所以我很确定这不是一个常规的系统过程。
测试在debian 11 AMD Ryzen 5 2600六核处理器上进行
GUI正在运行,但没有浏览器等。我监控了整个处理器的使用情况,大多数核心都没有做任何事情。
请注意,它是一个细胞自动机,它在测试过程中进化,所以输入数据是不一样的,它不断变化。
不过,我不认为,根据数组中的数字,累加数组所需的时间会有什么不同……
此外,如果性能变化是数据驱动的,那么不太可能看到随机数据在整整一分钟内产生大约相同的运行时……
问题:我看到了什么???是什么导致的???
我的直觉是,也许它与python
线程调度有关,但我不知道,如果numpy
使用线程,而我的代码中只有1个线程...
平均而言,“较慢”和“较快”状态之间至少有2倍的性能差异,因此使代码保持在“较快”状态将非常有益。
我有两张图片:
其中一幅图像是diff_3
的值,一个又一个周期,放大越来越多。
另一个图像是diff_1
,diff2
,... diff_6
,全部在1张图像中。在这个尺度下很难看到细节,但diff_3
和diff_5
在某种程度上是可以比较的。正如你所看到的,“快”和“慢”的时间段是匹配的,但并不完全匹配。
在图像上有大约650万个周期。
1条答案
按热度按时间rryofs0p1#
我认为@slothrop的评论是在现场。
我做了一个更长的测试,测量了核心频率,温度,将其与执行速度进行比较,并绘制了一个校正的执行速度。
我也意识到,为什么热循环的周期在增长:我收集了内存中的数据,并定期转储所有数据(而不仅仅是追加)。随着收集的数据越来越多,保存时间也会增加,从而使处理器有更多的时间进行冷却。
在图像上:
CPU温度与循环执行时间。
原始循环执行时间与频率校正。两者都有100的长期移动平均线。为了更容易比较,校正数据系列的共同频率是平均核心频率。