我必须在功率X(X在1到300之间的任何地方)的基数50中提出许多数字。 这些数字存储为bignums。
我的问题是:因为我会多次乘以两个bignums数字(基数为50),缓存这些乘法会更快吗?
因此,每当我将a[]
乘以b[]
时,我必须多次a[i]*b[j]
a[i]
和b[j]
基数为50。< / p>
我在想,而不是每次实际做a[i]*b[j]
,事先创建矩阵不会更快:prod[50][50]
,其中prod[i][j] = i*j
。然后我会有类似prod[a[i]][b[j]]
的内容。
是否更快地从内存读取然后实际进行乘法?
如果我的问题不明确,请快速举例:
而不是:
for(int i=1; i<=100; ++i){
sum += 50*30;
sum += 37*20;
}
这是否更快:
for(int i=1; i<=100; ++i){
sum += prod[50][30];
sum += prod[37][20];
}
答案 0 :(得分:3)
简短回答:是的,很有可能。
答案很长:这取决于。计算高速缓存中的乘法可能比从内存中获取大数字更快(如果它不在高速缓存中)。
你真的需要实现缓存并对“无缓存”进行基准测试,看看你得到了什么。
还要记住,权力的计算能力不仅仅是乘法,例如,如果我们想要y = x 5 ,而不是计算y = x * x * x * x * x
,我们可以计算{{1然后x2 = x * x;
,这只是四次乘法而不是五次。如果你有x 300 ,你可以通过多次使用相同的方案(计算x4和x16等)来节省一些资金。