粗略估计程序执行时间

问题描述

如何粗略了解程序在普通电脑上花费的时间,以便根据输入我可以知道我的算法是否会在给定的时间限制(2 秒等)内获得 TLE。

假设我必须遍历大小为 10^6,10^7,10^7 等的数组。

我认为遍历 10^6 数组需要 1 秒..

如果有人能解释清楚。

解决方法

检查当前处理器的每周期指令数,然后我会查看汇编代码并计算所需的周期数。

获得循环次数后,将其乘以循环时间。

,

在这种情况下,需要考虑几个因素才能得出任何结论。

每条机器/汇编指令都需要一个或多个时钟周期才能完成。

获取程序的汇编代码后,您可以使用以下公式计算总时间:

Execution time = Total number of cycles * Clock cycle time = Instruction count * cycles per instruction * clock cycle time

一般来说,你不能直接估计处理一个大小为 10^6 的数组的总时间为 1 秒。

执行程序的时间可能取决于以下因素:

  1. 处理器:要找到最接近的估计值,您可以阅读处理器手册以获取指令的每条指令周期数(因为不同的指令需要不同的周期数才能退出)并使用上面的公式。

  2. 数据/操作数:操作数的大小(在您的情况下,数组中的数据)对延迟有影响。

  3. 缓存:访问同一缓存行上的数据所需的时间是相同的。因此,总时间也取决于CPU总共需要访问的缓存行数。

  4. 编译器优化:现代编译器在优化不涉及读/写操作的代码方面非常聪明。在您的情况下,您只是遍历数组而不执行任何操作。因此,由于优化,遍历数组所需的时间可能远少于 1 秒。