簡體   English   中英

C++ - 最快的 integer 類型?

[英]C++ - the fastest integer type?

我一直在對算法進行基准測試,沒有必要知道細節。 主要組件是緩沖區(原始整數數組)和索引器(整數 - 用於訪問緩沖區中的元素)。

緩沖區最快的類型似乎是 unsigned char,以及 short、int、long 的有符號和無符號版本。 但是 char/signed char 速度較慢。 差異:1.07 倍。

對於索引器,有符號和無符號類型之間沒有區別。 然而,int 和 long 比 char 和 short 快 1.21 倍。

在考慮性能而不是 memory 消耗時,是否應該默認使用一種類型?

注意:用於緩沖區和索引器元素的操作是賦值、遞增、遞減和比較。

通常最大的勝利來自緩存。

如果您的數據值足夠小,可以容納 8 位,那么與使用 int 並浪費 3 個字節/值相比,您可以在 CPU 緩存中容納更多數據。 如果您正在處理一個數據塊,您將在高速緩存命中方面獲得巨大的速度優勢。

索引的類型不太重要,只要它適合 CPU 寄存器(即不要嘗試在 8 位 CPU 上使用long long ),它就會有相同的速度

編輯:還值得一提的是,測量速度很棘手。 您需要多次運行該算法以允許緩存,您需要觀察 CPU 上還有什么在運行,甚至還有哪些其他硬件可能正在中斷。 除非您非常小心,否則 10% 的速度差異可能會被視為噪音。

它在很大程度上取決於底層架構。 通常最快的數據類型是那些字寬的。 根據我使用 IA32 (x86-32) 的經驗,小於/大於 word 數據類型會導致懲罰,有時甚至超過一次 memory 讀取一個數據。

一旦進入 CPU 寄存器,通常數據類型長度並不重要(如果整個數據適合一個寄存器,也就是說),而是您用它們完成的操作。 當然浮點運算是最昂貴的; 最快的是加法、減法(也是比較)、按位(移位等)和邏輯運算(和、或...)。

沒有關於哪種類型更快或更慢的承諾。 int應該代表機器的自然字長,不管它是什么意思,所以它可能 go 更快。 或更慢,取決於其他因素。

以下是基本整數類型或擴展整數類型的 typedef。

檢查快速模式。 您也可以找到其他類型(字符)的快速模組。

圖書館是:: cstdint

uint_fast8_t:: 我的建議

http://www.cplusplus.com/reference/cstdint/

??您可能需要了解您正在使用的機器的體系結構!!

正如所說, int在大多數情況下代表機器字。 因此int將具有與處理器寄存器相同的長度,因此不會執行任何其他操作來將int放入寄存器而不是返回 RAM。

如果您使用char ,它比int小 4 倍(在 x86 系統上),也比處理器寄存器小 4 倍。 所以在將它放入 RAM 之前,它應該被截斷。 結果使用了更多的時間。

此外,具有 32 位寄存器的處理器無法執行 8 位數字的操作。 如果將 char 添加到 char,則它們都將被注冊。 所以每個寄存器將有 8 位的 char 值和 24 位的垃圾。 將添加兩個 32 位值,然后結果將被截斷為 8 位。 charshort同時工作的原因是使用了相同數量的附加操作。 而對於int額外的操作沒有完成。

我想補充一點,處理器intunsigned int完全相同,因為它以相同的方式對待它們。 對於某些編譯器, intlong int也可能相同。

所以最快的 integer 類型是長度與機器字相同的類型。 如果您使用比機器字更小的類型,程序將運行得更慢。

暫無
暫無

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

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