2012-04-27 63 views
0

我見過不少例子,其中二進制數字正在代碼中使用,如32,64,128等(例如,非常着名的示例 - 我的世界)在代碼中使用二進制數字是否可以提高性能?

我想問一下,是否使用二進制數在像Java/C++這樣的高級語言中有什麼幫助?

我知道程序集,你總是寧願使用它們,因爲在低級語言中,如果你超出了註冊限制,它會過度複雜化。

如果您使用二進制數字,程序運行速度會更快/保存更多的內存嗎?

+2

呃,*所有*號都是二進制的。 – 2012-04-27 17:35:42

+7

你的意思是說,兩個權力,而不是? – Makoto 2012-04-27 17:37:20

+0

恩,呃。在PC 16位架構中有寄存器。如果我沒有記錯的話,一個寄存器最多可以保持65535。如果你想添加兩個低於這個數字的數字,那麼它的小菜一碟。但是,如果數字高於這些數字,則會遇到大問題,這會花費額外的〜200行。這就是這個問題的關鍵,高級語言如何處理這些情況。 @Makoto是的,我的意思是兩個冪 – 2012-04-27 17:39:24

回答

0

他們使用的原因可能是不同的 - 例如,位掩碼。

如果你看到他們的數組大小,它並不真正提高性能,但通常內存是由2的冪分配。如果你寫了char x[100],你可能會得到128個分配的字節。

+0

這是誤導,內存通常與8個字節的區域對齊,但這並非總是如此,如果您在數組中使用整數,則它已經對齊,因爲int是完整的字大小。 – drew212 2012-04-27 18:28:03

+0

@ drew212我不是在談論對齊。 – 2012-04-27 18:30:57

+1

那你到底在說什麼?當分配內存並添加填充時,這是由於對齊。大多數當前的CISC系統不再受此限制,但對齊內存仍然更快,這就是爲什麼它完成了。你有什麼參考資料/你在談論什麼? – drew212 2012-04-27 18:46:43

1

與大多數情況一樣,「取決於」。

在編譯語言中,更好的編譯器會推斷有時可以用不同的更快的機器指令完成慢速機器指令(但只適用於特殊值,如2的冪次)。有時候編碼員知道這一點,並據此編程。 (例如,乘以2的冪是便宜的)

其他時候,算法適用於涉及兩個冪的表示(例如,諸如快速傅立葉變換或合併排序的許多分而治之算法)。

還有一些時候,它是表示布爾值(比如位掩碼)的最簡潔的方式。除此之外,其他時間對於內存目的來說效率更高(通常是因爲它的速度太快以至於不能將邏輯乘以兩個冪,OS /硬件等將使用緩存行/頁面大小等)。這是兩個權力,所以你會很好地爲你的重要數據結構擁有兩種不同大小的權力)。

然後,除此之外,其他時間..程序員只是習慣於使用兩個冪,他們只是做它,因爲它看起來像一個很好的數字。

0

不,您的代碼將以相同的方式運行,不管您使用的是什麼數字。

如果用二進制數表示的數字是2的冪數,如:2,4,8,16,104 ....它們通常由於空間的優化而通常。例如,如果你有一個8位指針,它可以指向256(即2的冪)地址,所以如果你使用少於256的值,你就是在浪費你的指針....所以通常你會分配一個256緩衝區...這同樣適用於2號碼的所有其他功率......

+0

小心。我知道在Android平臺下我已經看到我的倍數被製成桶轉換,因爲它們是兩個方便的權力。 – Kaganar 2012-04-27 17:41:48

+0

是的,對於計算這總是如此......但並不總是你在乎高級語言....所以我(個人opnion),不認爲這是今天的問題....但在過去(或低級語言),這是必須的!但是,無論時間如何,換班都很有用! – 2012-04-27 17:45:29

0

在您的程序中使用兩個數字的冪有一些好處。位掩碼是其中的一個應用,主要是因爲按位運算符(&,|,<<,>>等)非常快。

在C++和Java中,這個過程很公平 - 特別是在GUI應用程序中。你可以有32個不同的菜單選項(如可調整大小,可移動,可編輯等),並應用每個菜單選項,而不必經歷複雜的值的添加。

在原始加速或任何性能改善方面,這確實取決於應用程序本身。 GUI程序包可以是巨大的,所以在應用菜單/界面選項時加快速度是一大勝利。

0

從你的問題的標題,這聽起來像你的意思是,「它使你的程序更有效的,如果你在寫二進制常量?」如果這就是你的意思,那麼答案是強調的,不。編譯器會在編譯時將所有常量轉換爲二進制,所以在程序運行時,它沒有任何區別。我不知道編譯器是否可以解釋二進制常量快於十進制,但這種差異肯定是微不足道的。

但你的問題的身體似乎表明你的意思,「這是二進制數輪使用常量」,而不是一定是二進制數字表達出來。

對於大多數用途,答案是否定的。例如,如果計算機必須將兩個數字加在一起,那麼添加一個恰好是二進制數字的數字不會比添加不正確的數字更快。

乘法運算可能稍快。有些編譯器足夠聰明,可以將乘法乘以2的冪運算成位移操作而不是硬件乘法,並且位移通常比乘法更快。

在陣列回到我的彙編語言日子裏,我常常使元素具有爲2,所以我能指標的權力與一個位移位,而不是乘數組的大小。但是在高級語言中很難做到這一點,因爲你必須做一些研究來發現原語在內存中佔用了多少空間,編譯器是否在它們之間添加填充字節等等。如果你確實增加了一些字節到一個數組元素,以便將其填充到2的冪,整個數組現在變大了,所以你可能會產生一個額外的頁面錯誤,即操作系統內存不足,必須寫一個chunck的數據傳輸到硬盤,然後在需要時將其讀回。一個額外的硬盤驅動器需要比1000次乘法更多的時間。

在實踐中,(一)不同的是那麼微不足道,這將幾乎永遠是值得擔憂;和(b)你通常不會知道發生在低級別的所有事情,所以通常很難預測與其分支派生有關的變化是否會有所幫助或受到傷害。

總之:不要打擾。使用問題自然的常量值。

0

在大多數情況下,答案几乎總是否定,沒有明顯的性能差異。

不過,也有不使用二進制數時數組/結構尺寸/長度會給明顯的性能優勢,某些情況下(很少)。這些都是你填充緩存時的情況,也是因爲你正在遍歷一個填充緩存的結構,這樣每次循環訪問數組/結構時都會發生緩存衝突。這種情況非常罕見,不應該預先優化,除非您的代碼出現問題的速度比理論上的限制慢得多。此外,這種情況非常依賴於硬件,並且會從系統變爲系統。

相關問題