Arrays 阵列访问/写入性能差异?
这可能与语言有关,但一般来说,访问和写入数组之间的性能差异是什么 例如,如果我试图编写一个数组,并将素数表示为布尔数组 在找到素数后,我可以说Arrays 阵列访问/写入性能差异?,arrays,performance,algorithm,Arrays,Performance,Algorithm,这可能与语言有关,但一般来说,访问和写入数组之间的性能差异是什么 例如,如果我试图编写一个数组,并将素数表示为布尔数组 在找到素数后,我可以说 for(int i = 2; n * i < end; i++) { prime[n * i] = false; } for(int i=2;n*i
for(int i = 2; n * i < end; i++)
{
prime[n * i] = false;
}
for(int i=2;n*i
或
for(int i=2;n*i
后一种情况的目的是在写入之前检查值,以避免重写许多已经检查过的值。在性能方面是否有任何实际的提高,或者访问和写入的速度是否基本相同?如果没有运行该操作系统的机器/操作系统的细节,就无法回答这样一个一般性的问题,但一般来说,后者会变慢,因为:
如果没有运行此操作系统的机器/操作系统的详细信息,就无法回答此类一般性问题,但通常情况下,后者的速度会较慢,因为:
一般来说,这更多地取决于机器而不是编程语言。写操作通常需要更多的时钟周期,因为根据机器的不同,需要在内存中更新更多的缓存值 然而,您的第二段代码将慢得多,这不仅仅是因为有“更多的代码”。最大的原因是,在大多数机器上使用if语句时,CPU都会使用分支预测器。CPU准确地预测if语句将以何种方式提前运行,如果错误,则必须回溯。看到并理解原因 如果您想进行一些优化,我建议您:
- 个人资料!看看到底是什么在占用时间
- 乘法比加法难得多。尝试重写循环,使i+=n,并将其用于数组索引
- 循环条件“应该”在每次迭代时完全重新评估,除非编译器将其优化掉。所以试着避免乘法运算
- 使用-O2或-O3作为编译器选项
- 您可能会发现,由于缓存位置的原因,n的某些值比其他值快。您可能会想到一些聪明的方法来重写代码以利用这一点
- 分解代码并查看它在处理器上实际执行的操作
- 个人资料!看看到底是什么在占用时间
- 乘法比加法难得多。尝试重写循环,使i+=n,并将其用于数组索引
- 循环条件“应该”在每次迭代时完全重新评估,除非编译器将其优化掉。所以试着避免乘法运算
- 使用-O2或-O3作为编译器选项
- 您可能会发现,由于缓存位置的原因,n的某些值比其他值快。您可能会想到一些聪明的方法来重写代码以利用这一点
- 分解代码并查看它在处理器上实际执行的操作
for(int i = 2; n * i < end; i++)
{
if(prime[n * i])
{
prime[n * i] = false;
}
}