2014-09-10 27 views
2

我所做的事情在預處理器上非常沉重。 MinGW需要一分鐘或2分鐘來編譯它,但它確實通過了單元測試; Eclipse正在掙扎,並彈出一個Java堆低,或最終溢出。我的問題是有辦法讓預處理器更容易嗎?我應該只增加我的Java堆嗎?還是有更好的方法在編譯時嵌套C宏,CRC計算,Eclipse Java崩潰

這裏填充一個表,它是:

我創建了一個CRC查找表,並決定在編譯時來填充它(關鍵字:編譯時),和不想硬編碼任何數字。所以我想出了一個宏來計算CRC,只是硬編碼多項式。 (也許稍難讀,但它通過單元測試)

// Define CRC polynomial 
#define POLYNOMIAL (0x8005) 
#define CRC_1ITERATION(crc) (\ 
       (((crc)&0x7FFF)<<1)^(((crc)&0x8000)?POLYNOMIAL:0) ) 

然後它傳播到16次...宏16次深的重新調用!

// Iterate the CRC polynomial 
#define CRC_2ITERATIONS(crc) CRC_1ITERATION( CRC_1ITERATION(crc)) 
#define CRC_4ITERATIONS(crc) CRC_2ITERATIONS(CRC_2ITERATIONS(crc)) 
#define CRC_8ITERATIONS(crc) CRC_4ITERATIONS(CRC_4ITERATIONS(crc)) 
#define CRC_16ITERATIONS(crc) CRC_8ITERATIONS(CRC_8ITERATIONS(crc)) 

CRC_16ITERATIONS()現在的東西我可以調用到它的輸出16次迭代後過渡輸入CRC。我用它來填充我的桌子。其實,我變得更加的嵌套宏來填充表,而是保持簡單的代碼,就足以使Eclipse鬥爭:

// Populate the table (EDIT: corrected spelling) 
CRC_16ITERATIONS(0), CRC_16ITERATIONS(1), CRC_16ITERATIONS(2), CRC_16ITERATIONS(3), 
CRC_16ITERATIONS(4), CRC_16ITERATIONS(5), CRC_16ITERATIONS(6), CRC_16ITERATIONS(7), 
CRC_16ITERATIONS(8), CRC_16ITERATIONS(9), CRC_16ITERATIONS(10), CRC_16ITERATIONS(11), 
CRC_16ITERATIONS(12), CRC_16ITERATIONS(13), CRC_16ITERATIONS(14), CRC_16ITERATIONS(15) 

它的工作的MinGW包括通過單元測試,但就像我說的,我想我在Java/Eclipse中吹出某種括號或宏擴展堆棧。我希望能將這個擴展到256個入口表,但我懷疑MinGW需要半個小時來編譯它。

回答

3

前八次迭代只是將字節向上移動八個位置。你可以在參數中做到這一點,並使用CRC_8ITERATIONS而不是CRC_16ITERATIONS(這是因爲你多次拼錯了它CRC_16ITERATION)。

即:

CRC_8ITERATIONS(0), CRC_8ITERATIONS(1 << 8), CRC_8ITERATIONS(2 << 8), CRC_8ITERATIONS(3 << 8), 
CRC_8ITERATIONS(4 << 8), CRC_8ITERATIONS(5 << 8), CRC_8ITERATIONS(6 << 8), CRC_8ITERATIONS(7 << 8), 
CRC_8ITERATIONS(8 << 8), CRC_8ITERATIONS(9 << 8), CRC_8ITERATIONS(10 << 8), CRC_8ITERATIONS(11 << 8), 
CRC_8ITERATIONS(12 << 8), CRC_8ITERATIONS(13 << 8), CRC_8ITERATIONS(14 << 8), CRC_8ITERATIONS(15 << 8) 

,編譯,我快約256倍比使用CRC_16ITERATIONS

對於這個特定的設置,我可以更快地通過最初在頂部移動這四個零並使用CRC_4ITERATIONS。即:

CRC_4ITERATIONS(0), CRC_4ITERATIONS(1 << 12), CRC_4ITERATIONS(2 << 12), CRC_4ITERATIONS(3 << 12), 
CRC_4ITERATIONS(4 << 12), CRC_4ITERATIONS(5 << 12), CRC_4ITERATIONS(6 << 12), CRC_4ITERATIONS(7 << 12), 
CRC_4ITERATIONS(8 << 12), CRC_4ITERATIONS(9 << 12), CRC_4ITERATIONS(10 << 12), CRC_4ITERATIONS(11 << 12), 
CRC_4ITERATIONS(12 << 12), CRC_4ITERATIONS(13 << 12), CRC_4ITERATIONS(14 << 12), CRC_4ITERATIONS(15 << 12) 

這編譯時間太快,我來衡量。

我可以採取進一步行動,增加一個CRC_3ITERATIONS,而做到這一點:

0, CRC_1ITERATION(1 << 15), CRC_2ITERATIONS(2 << 14), CRC_2ITERATIONS(3 << 14), 
CRC_3ITERATIONS(4 << 13), CRC_3ITERATIONS(5 << 13), CRC_3ITERATIONS(6 << 13), CRC_3ITERATIONS(7 << 13), 
CRC_4ITERATIONS(8 << 12), CRC_4ITERATIONS(9 << 12), CRC_4ITERATIONS(10 << 12), CRC_4ITERATIONS(11 << 12), 
CRC_4ITERATIONS(12 << 12), CRC_4ITERATIONS(13 << 12), CRC_4ITERATIONS(14 << 12), CRC_4ITERATIONS(15 << 12) 

根據需要用CRC_7ITERATIONSCRC_6ITERATIONS等您可以使用這一招的第一個128個字節只重複多次最後128個字節都需要使用CRC_8ITERATIONS,這個速度還是相當快的。至少對我來說,使用clang llvm 3.5。

儘管我更喜歡只是運行一個單獨的程序來生成一個文件,以包含其中的表格。

+0

太棒了。我完全應該看到這一點。是的,我現在可以做一個有256個入口的表沒有問題。我會更正問題中的拼寫,我不斷重新考慮並重新粘貼,顯然錯過了我添加的複數。謝謝! – Michael 2014-09-16 18:53:35