簡體   English   中英

在C ++中將字節流拆分為位

[英]Splitting a stream of bytes into bits in c++

我的程序將從當前文件中獲取字節流,該文件將使用二進制模式istream讀取。 為了使用數據,我稍后需要在程序中使用各個位。 目前,我不確定三件事,即從文件中讀取信息,對其進行處理以及將其存儲以備后用。 處理是我最不確定的部分,其他兩個是次要查詢。

為了接收數據,當前正在使用二進制istream,是否有更快的接收數據的方法? 為了存儲數據,我打算使用bool向量,因為在編譯時將不知道其大小,並且其大小可能會擴展到幾MB數據,是否有更好的存儲方法? 如果這對存儲很重要,那么將需要另一個過程,在需要這些位之前使用相對大量的內存。

最后一個問題(也是最令我困擾的問題)是如何將字節拆分為多個位,因為這將與大量數據一起處於循環中,我希望此方法盡可能高效。 第一個想法,也是我當前最喜歡的一個想法,是使用按位&檢查位是否被設置,然后進行比較以設置布爾值;

bitbool = (byte&128) != 0

下一種方法是先右移然后左移以保留最高有效位,然后再移位以保留兩個最高有效位並使用前一個方法隔離第二個最高有效位,但是我認為這將比前一個效率低方法。

最終的方法是使用一個八位寬的位集來轉換字節,然后讀出位並設置布爾值。 我不確定比特集,因為我之前從未使用過它們,盡管經過研究后似乎可以將它們用於此目的,但我不確定它的效率如何。

為了接收數據,當前正在使用二進制istream,是否有更快的接收數據的方法?

有多種方法可以將文件中的數據獲取到內存中,但是大多數方法是特定於平台的,需要操作系統調用或訪問硬件。

從文件讀取數據的關鍵是保持硬盤驅動器旋轉。 這意味着以最少的請求讀取盡可能多的數據。 使用std::istream::read方法和一個大緩沖區。

您的程序執行速度可能會慢於硬盤驅動器的數據傳輸速率。 在這種情況下,建議使用多個執行線程。 一個線程將數據讀入緩沖區。 另一個線程從緩沖區中提取數據並進行處理。 可能需要其他緩沖區來調整速度差異。 研究“雙重緩沖技術”。

如何將字節拆分為位?

對於大多數處理器,沒有快速的方法來測試或提取位。 通常,在旋轉位時執行速度變慢。

編寫代碼,然后為您的旋轉功能打印出匯編語言。 這將為您提供有關編譯器如何生成代碼的指示。

保存匯編語言列表。 接下來,將編譯器選項的大小設置為高。 查看該函數的匯編語言。 與原始列表進行比較。 接下來,將編譯器選項設置為高以提高速度。 與原始列表進行比較。 選擇您認為最佳的版本。 如果您是平台處理器的匯編語言的熟練者,請使用編譯器的匯編語言並對其進行優化。

其他優化
首先, 分析代碼。 確定瓶頸在哪里。 在大多數情況下,瓶頸不在您認為的所在。 瓶頸代碼是開始優化的地方。

嘗試重新設計代碼。 這通常會產生最高的性能增益。
例如,設計代碼以減少函數調用,開關, if語句和循環。 所有這些都包含跳轉或分支,這會減慢處理速度。 快速執行的想法不包含任何跳躍。

重新設計代碼以更有效地使用數據緩存。 例如,如果您有4個數組,則將其更改為一個包含4個變量的結構的數組:
使用不當

  int a[10240], b[10240], c[10240], d[10240];

更好的用法

  struct Items
  {
    int a, b, c, d;
  }
  Item array[10240];

有關更多提示,請在StackOverflow中搜索“ [c ++]優化”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM