2011-07-09 49 views
4

通過簡單的文件加密/解密做一些練習,目前我正在讀一串字節,並對每個字節執行相應的位操作,然後將它們寫入輸出文件。對大量字節進行位操作

這種方法看起來很慢。例如,如果我想通過0xFF對每個字節進行XOR運算,我會循環遍歷每個字節和XOR 0xFF,而不是做一些魔術,並且每個字節都快速異或。

是否有更好的方法來執行位操作而不是一次一個字節?

+1

你現在如何存儲字節?作爲整數列表?除非你有超過一打的MB,否則字節表示不太可能是減速的根源。在投機之前先測量(即輪廓)。 – phihag

+0

你確定這些標籤應該是加密/解密嗎?我在你的問題中沒有看到任何加密操作... –

回答

3

不管是什麼,似乎每個字節將不得不從內存

  • 讀,
  • 以某種方式修改,
  • 寫回內存。

可以通過通過對4進行XOR運算,節省時間的位(沒有雙關語意)一次上多個字節操作,例如,或甚至8個字節的整數,因此,將相關聯的開銷與循環管理,大致,一個因子4或8,但這種改善可能不會達到整體算法的顯着收益。

通過讀取表中預先計算的值來替換CPU /語言的「本地」位操作(異或,移位,旋轉等),可以找到其他改進。然而要小心,這些本地操作通常是相當優化的,並且您必須非常勤奮地設計外部等效操作,並精確測量這些操作的相對性能。

編輯:糟糕,我剛剛注意到[Python]標記,並且在另一個響應中也引用了numpy。
要小心......雖然Numpy按位數組的建議是合理的,但這一切都取決於手頭問題的實際參數。例如,排隊numpy的按位函數所隱含的底層數組可能會損失相當長的時間。 看到這個似乎非常相關的Stack Overflow question。雖然專注於XOR操作,但這個問題提供了很多可操作的提示,用於改善循環等,以及用於概要分析。