2013-05-02 70 views
0

我必须在功率X(X和1到300之间的任何值)范围内提高基数50中的许多数字。 这些数字存储为bignums。高速缓存乘法操作

我的问题是:因为我会乘以很多倍两位数的数字(基数50)会缓存这种乘法更快吗?

所以,每次我乘a[]b[]时间我会做a[i]*b[j]很多次,a[i]b[j]是基地50个号码。

我在想每次都不是在做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

为什么不首先将数字转换为二进制表示? – Lol4t0 2013-05-02 17:07:04

+0

这将如何帮助?是否需要更多时间才能转换为二进制文件并返回到基数50?请注意,这些数字很大,例如50^1000。不能存储在单个变量中。 – Cristy 2013-05-02 17:08:38

+4

为什么要50?在实现bignum时(最多使用'sqrt(MAXINT)'),通常使用更大的基数,因为这可以用更少的操作和更少的内存来完成更多的操作。即使你最终需要基数为50的输出,我也会下注,这可以节省足够的时间,以便在50次转换后仍然是净赢。 – delnan 2013-05-02 17:10:58

回答

3

简答:是的,最有可能的。

长答案:这取决于。计算缓存中的乘法运算速度可能比从缓存中取出大量缓存中的运算速度要快。

您确实需要实施缓存并将其与“无缓存”进行基准比较,以查看所得结果。

请记住也是权力可不仅仅是倍增,例如更有效地计算,如果我们想Y = X ,而不是计算y = x * x * x * x * x,我们可以计算出x2 = x * x;,然后y = x2 * x2 * x;,其中只有4次乘法,而不是五。如果你有几次使用同样的方案(计算x4和x16等),你可以节省大量的费用。

+0

是的,我已经在使用对数指数 - 复杂度log2(power)。 – Cristy 2013-05-02 17:11:17