2012-05-20 83 views
7

我正在編寫一個遊戲,並且想用一個數組來表示一塊板。我正在尋找效率,因爲我要做很多次迭代。在這種情況下,int數組或char數組對於棋盤表示來說似乎很方便。在int數組和char數組中進行操作時,效率方面有什麼區別嗎?效率:char數組與vs數組

我懷疑由於char數組的每個元素都有1個字節的大小,因爲內存中的表示方式不同,所以它可能會比較慢(考慮一個現代計算機,它至少具有32位int表示形式)...我是對?

在此先感謝。

編輯:我要生成遊戲樹,這就是爲什麼效率如此重要,以及時間消耗的小差異可以產生巨大的差異。

+0

我想不出任何原因'char'會變慢。如果有的話,可能取決於你在做什麼操作,它可能會更快。在8位體系結構的嵌入式目標中,「int」操作會比較慢。 – jedwards

+0

也許,但是'char'數組佔用較少的內存,如果它有足夠的元素,它可能會比'int'數組更快。 –

回答

5

對於哪個CPU/s?

有些CPU不能直接訪問小於「某些東西」的東西,編譯器需要生成一個「加載,移位和屏蔽」指令序列來訪問各個字節。使用int應該贏得這種情況。

某些CPU可以正常訪問字節。在這種情況下(如果涉及足夠的數據,那麼問題很可能是緩存大小和/或內存帶寬;和(至少對於80x86)我期望char只會因爲更多的數據打包到每個緩存行而獲勝。

對於哪種算法/ s?

如果你可以扔SIMD在上面,char很可能會贏。例如,對於128位SIMD,每條指令可以處理16個字節,或者每條指令可以處理4個(32位)整數,並且因爲這一點,可能會快4倍。

最好的建議是使用類似:

#ifdef USE_INT 
    typedef int thingy 
#else 
    typedef unsigned char thingy 
#endif 

然後你可以分析它,改變它,只要你喜歡。

+0

+1,但是你的'typedef'是錯誤的。 –

+0

嘿 - 這很尷尬 - 現在修好了。謝謝 :-) – Brendan

4

char s通常是1字節對齊的,並且int通常是4字節對齊的。假設您正在使用遵循此標準的機器,則兩個陣列都將其內容存儲爲連續的內存塊(int陣列的大小是char陣列的4倍)。因此,就他們如何利用大量分配的內存而言,任何一個人都不會有任何不同。這就是說,即使底層內存表示有任何不同,我懷疑它會影響你的程序的吞吐量。

+0

我同意第一句話,但是這不意味着int表示(在32位機器上)會佔用4倍的內存嗎?是的,塊將是連續的,但不是相同的大小。 – jedwards

+0

我更新了我的答案,以澄清這一點(我認爲讀者會接受這一點,但也許我應該更明確)。 –

+0

我認爲讓我感到滿意的一句話是「任何一個人在內存總利用率方面都不會有任何不同」。 - 它的總內存利用率,它們會有所不同,一個是另一個的4倍。 – jedwards

3

試試看看。用-S標誌來獲得彙編代碼:

gcc -Wall -S code.c -o code.s 

看看是否有任何明顯的代碼長度差異。這不一定是整個故事,因爲您需要了解彙編程序來判斷差異。但它可能會給你一個提示 - 可能int和char將會大致相同。

請注意,如果混合類型,幾乎可以肯定會得到字符數組稍慢的代碼。因此,如果你將數據存儲在char數組中,然後使用int類型以某種方式「處理」,那麼每次在兩者之間進行轉換時可能會獲得額外的指令。用-S來嘗試。

+0

+1!這將是確認這些斷言的明確證據。這兩個很好的答案,我可以選擇一個很遺憾。 – PALEN