Performance 这两个循环在运行时是否存在差异,是否存在异常?
考虑以下两个循环,其中N=10^9或某个足够大的值,可以注意到该循环的效率低下Performance 这两个循环在运行时是否存在差异,是否存在异常?,performance,algorithm,loops,optimization,runtime,Performance,Algorithm,Loops,Optimization,Runtime,考虑以下两个循环,其中N=10^9或某个足够大的值,可以注意到该循环的效率低下 Loop x = 1 to N total += A(x) total += B(x) 或 其中每个函数取x,执行一些任意的算术计算(例如x^2和3x^3或其他,无所谓),并返回一个值 整个运行时是否会有任何差异,如果有的话,什么时候不会有差异?主要的差异是第一个测试X对N,N次,而第二个测试X对N,2N次。循环本身有轻微的开销 在每次迭代中,您至少需要执行2个操作,增加计数器,然后将其与结束值进行
Loop x = 1 to N
total += A(x)
total += B(x)
或
其中每个函数取x,执行一些任意的算术计算(例如x^2和3x^3或其他,无所谓),并返回一个值
整个运行时是否会有任何差异,如果有的话,什么时候不会有差异?主要的差异是第一个测试X对N,N次,而第二个测试X对N,2N次。循环本身有轻微的开销 在每次迭代中,您至少需要执行2个操作,增加计数器,然后将其与结束值进行比较
因此,您要再执行2*10^9个操作。每个循环需要四个操作:
假设调用这两个函数的顺序并不重要,那么在大多数常见情况下,差异不会明显。然而,在非常罕见的非常紧的循环情况下,单个循环将占用更少的CPU资源。事实上,一种常见的循环技术依赖于在循环期间通过多次重复主体来减少每次迭代检查和设置操作在整个CPU负载中所占的份额,并通过相应的系数减少迭代次数。有几件事需要考虑。一个是在第二个版本中,对循环本身执行的指令是原来的两倍(条件检查、递增
x
等)。如果你的功能真的很琐碎,那可能是一个很大的代价
然而,在更现实的情况下,缓存性能、寄存器共享以及诸如此类的事情将产生更大的影响。例如,如果两个函数都需要使用大量寄存器,您可能会发现第二个版本的性能比第一个版本差,因为编译器需要将更多寄存器溢出到内存中,因为它在每个循环中执行一次。或者,如果A
和B
都访问相同的内存,则第二个版本可能比第二个版本快,因为所有B
的访问在第二个版本中都是缓存命中,但在第一个版本中未命中
所有这些都是高度特定于程序和平台的。如果要优化某个特定的程序,则需要对其进行基准测试。如果两个函数都使用了大量内存,例如,它们创建了一些大数组,并在每次迭代中递归修改它,由于内存缓存等原因,第一个循环可能较慢。有许多潜在因素需要考虑 1) 迭代次数——循环设置是否支配任务 2) 循环比较惩罚与任务复杂性
for (i=0;i<2;i++) a[i]=b[i];
用于(i=0;我想这两个函数是否有副作用,执行顺序可能会影响某些事情?如果你有一个具体的例子,为什么不试试呢?我想不出一个好的例子,执行顺序会严重影响运行时——我不得不考虑一下。但是你的回答暗示,如果顺序不重要(也就是说,它们是完全独立的函数——一个计算x^2,另一个计算x^5,其他什么都不计算),运行时应该是相同的(或者至少可以忽略差异,除非启动一个新循环有成本)?对于以上两种功能,整体差异应该可以忽略不计。@DoSparKot我想我的问题已经开始被揭示为潜在的不正确形式,这取决于“任意”的含义--我心目中的函数不会做任何激烈的操作,只是一些任意的操作,可能会将一些值存储在累积和变量或其他东西中(例如,说total+=a(x)和total+=B(x))@DoubleBass:根据缓存访问或类似的情况,可能会有显著的差异,但这在很大程度上取决于具体情况。
for (i=0;i<2;i++) a[i]=b[i];