2

我的问题是这样的:

给定一行孤立的代码(即,不解析、读/写到 HDD 上的文件,而不是子程序等),是否有可能以任何程度的准确度和/或一致性来预测或测量代码将在给定系统上执行?

例如,假设我有以下代码(不是任何特定语言,只是概括):

1 |  If x = 1 then
2 |    x = x + 1
3 |  End If

执行第 2 行需要多长时间?

不是在这里寻找数字;我只是想知道这样的事情是否可行或实用。

谢谢!

更新:

现在我正在寻找一些数字......如果我要执行一个简单的For循环,每次迭代只需休眠 1 秒,在 60(实际)分钟后,它会有多远?换句话说,评估一行孤立代码所花费的时间是否可以忽略不计(假设没有错误或中断)?

4

5 回答 5

3

如果您查看此类文档,会发现基本操作在 CPU 上占用了多少时钟周期,以及这些时钟周期有多长。将这些数字转换为x = x+1在程序中执行所花费的时间是一门不精确的科学,但是通过检查编译器生成的汇编代码列表,您会得到一些线索。

当您从简单的算术语句转向大型程序时,科学变得越来越不精确,并且您开始遇到由现代 CPU 和现代操作系统和内存层次结构以及其他所有复杂性引起的各种问题。

于 2012-07-06T09:47:43.307 回答
1

最简单的方法是运行十亿次,看看花了多少时间,然后除以十亿。这应该消除时钟精度的问题。

于 2012-07-06T09:46:48.427 回答
1

听起来您可能有兴趣了解Big O Notation。使用 Big O,您可以弄清楚如何编写最有效的算法,而不管运行它的机器的速度如何。

大多数计算机通常会在后台运行一些进程、服务或其他“作业”,并且由于各种原因在不同时间消耗资源......这往往会导致难以预测确切的执行时间。但是,如果您可以将上述代码分解为汇编语言并计算在机器级别使用的位数、寄存器和时钟滴答数,我认为可以得到准确的估计。

于 2012-07-06T09:52:15.467 回答
1

答案是响亮的不。例如,考虑如果在加法期间引发中断会发生什么:下一条指令将在中断服务执行,因此给人的印象是加法花费了很多时间。

如果我们谈论的是 ISR 禁用条件,那么答案是“视情况而定”。例如,考虑到对 的分支预测错误if可能会大大减慢执行速度。多核 CPU 也是如此(通常一些 ALU 在内核之间共享,因此一个内核上的活动可能会影响其他内核上的操作性能)。

如果我们谈论的是在具有单核和单级管道的 CPU 上禁用 ISR 的情况,那么我想您应该几乎能够预测需要多长时间。问题是,您可能正在使用微控制器(以及旧的)。:)

更新:再想一想,即使在最后一种情况下,您也可能无法准确预测它:实际上某些操作是依赖于数据的(典型示例是对非正规数的浮点操作)。

于 2012-07-06T09:59:27.063 回答
0

您可以弄清楚的一种方法是编写该行代码 1000 次,然后计算运行该代码所需的时间,然后将时间除以 1000,以获得更准确的时间,您可以运行该测试 10 次并查看你完成所有这些测试的平均时间。

于 2020-09-29T17:40:18.490 回答