2013-05-02 44 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