我的问题是:
给定一行隔离代码(即,不解析,读取/写入HDD上的文件,而不是子程序等),是否可以在任何程度上进行预测或测量准确性和/或一致性代码在给定系统上执行需要多长时间? 的的
例如,假设我有以下代码(不是任何特定语言,只是概括):
1 | If x = 1 then
2 | x = x + 1
3 | End If
执行第2行需要多长时间?
我不在这里寻找数字;我只是想知道这样的事情是否可行或实际。
谢谢!
更新
现在我正在寻找一些数字...如果我要执行一个简单的For
循环,每次迭代只需睡1秒,在60(实际)分钟后,它会有多远?换句话说,评估一行隔离代码所花费的时间是否可以忽略不计(假设没有错误或中断)?
答案 0 :(得分:3)
如果查看this等文档,您会发现基本操作占用CPU的时钟周期数,以及这些时钟周期的时长。将这些数字转换为在程序中执行x = x+1
所花费的时间是一项不精确的科学,但是通过检查编译器生成的汇编代码列表,您将获得某种线索。
当你从简单的算术语句转向大型程序时,科学变得越来越不精确,你开始遇到由现代CPU和现代操作系统以及内存层次结构的复杂性引起的各种问题。
答案 1 :(得分:1)
最简单的方法是运行十亿次,看看花了多少时间,再划分十亿。这应该可以解决时钟精度问题。
答案 2 :(得分:1)
听起来您可能有兴趣了解Big O Notation。使用Big O,您可以弄清楚如何编写最有效的算法,无论它运行的机器的速度如何。
大多数计算机通常会在后台运行一些进程,服务或其他“作业”,并且由于各种原因在不同时间消耗资源......这往往会使预测确切的执行时间变得困难。但是,如果你可以将上面的代码分解为汇编语言并计算机器级别使用的位数,寄存器和时钟滴答,我会假设可以得到准确的估计值。
答案 3 :(得分:1)
答案是响亮的否定。例如,考虑如果在添加期间引发中断会发生什么:下一条指令将在中断服务之后执行,因此给人的印象是添加花费了大量时间。< / p>
如果我们谈论的是ISR禁用状况,那么答案就是“它取决于”。例如,考虑 如果我们在具有单核和单级流水线的CPU上谈论ISR禁用条件,那么我猜你应该能够预测它需要多长时间。问题是,你可能正在研究一个微控制器(以及一个旧的微控制器)。 :) 更新:第二个想法,即使在最后一种情况下,您可能无法准确预测它:实际上一些操作是依赖于数据的(规范示例是非正规数字上的浮点运算)。if
上的分支错误预测可能会大大减慢执行速度。关于多核CPU也是如此(通常一些ALU在核心之间共享,因此核心上的活动可能会影响其他核心上的操作性能)。
答案 4 :(得分:0)
一种计算方法是将这行代码编写1000次,然后计算运行该代码所需的时间,然后将该时间除以1000,以获得更准确的时间,您可以运行该测试10次并查看您从所有这些测试中抽出的平均时间。