2012-06-15 36 views
-1

我有以下代碼:對齊或不對齊堆棧上的char數組?

char stats[109]; /* !LINE UNDER QUESTION! */ 
sprintf(stats, 
    "OBJECTS:\n%u/256\n" \ 
    "BLOCKS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \ 
    "QUADS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \ 
    "LIGHTMAPS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \ 
    "CHECKPOINTS:\n%u/256\n" \ 
    "HINTS:\n%u/256", 
    Map_This_Header.objects, Map_This_Header.blocks, Map_This_QuadCount, 
    lmapcount, Map_This_Header.checkpoints, Map_This_Header.hints); 

是否細到靜態分配的109個字符(109就夠了我的文字)陣列,或對準陣列128個字節會提高性能?

我不關心文件大小和內存使用情況,性能對我來說很重要,我的代碼必須在舊計算機上以60 FPS運行。

+3

由於性能對您至關重要。唯一的方法就是測試兩種方法並在您的環境中對它們進行配置。這將爲您提供比您明智的猜測更準確的評估結果,您將得到此處。 –

+1

如果您關心性能,爲什麼要做一些文本格式的加載? – Rook

+0

此外,不關心內存使用也可能會損害性能,如果你開始獲取緩存未命中,因爲你有太多的數據不適合緩存空間... – Rook

回答

2

我想這是代碼將運行的硬件太多相關。我們能想到的兩個相反的論點實例來回答這個問題,假設會出現在你的陣列在棧上分配的其他變量:

  • 如果保持陣列小,這將減少用於緩存條目的數量保存所有經常使用的變量。
  • 如果您在兩個冪的位置對齊大小,並且陣列的地址位於CPU的一個寄存器中,根據CPU的尋址模式計算變量的地址可能會更容易一些。例如,ARM對0x12000之類的偏移量進行編碼比0x12001更容易,因爲它需要一個位域並對其進行移位。

然而,第二個參數似乎不太相關,因爲它只會影響您可以實例化的衆多變量中的一個變量。無論如何,如果你想確定的話,你需要對你的代碼進行基準測試。

+0

處理器是x86。 – Triang3l

0

如果對齊它會提高性能,編譯器應該在適當的優化級別爲您調整它。這是因爲編譯器可以自由地按照自己認爲合適的順序排列自動變量。

在一般情況下,除非你的代碼實際上需要它要對齊,如果你存儲指針字段的低位整數操作(例如,從而需要實際基指針對齊到更大邊界),你不應該把這樣的假設編碼到你的代碼中。