簡體   English   中英

C ++ / Boost ASIO中的內聯ntohs()/ ntohl()

[英]Inline ntohs() / ntohl() in C++ / Boost ASIO

嗨,我正在使用C ++ / Boost ASIO,出於性能原因,我必須內聯ntohl() 每個數據包包含256個int32,因此對ntohl()了大量調用。 有沒有人這樣做過?

這是VC10 ++中編譯的程序集輸出,所有優化都打開:

;  int32_t d = boost::asio::detail::socket_ops::network_to_host_long(*pdw++);
mov      esi, DWORD PTR _pdw$[esp+64]
mov      eax, DWORD PTR [esi]
push     eax
call     DWORD PTR __imp__ntohl@4

我也嘗試過winsock提供的常規ntohl() 任何幫助將不勝感激。

另外,我一直在考慮使用#define宏的C方式來執行簡單的int32桶移位(如果網絡順序與編譯時的機器順序不匹配)。 如果有人知道並且可以在x86 / x64架構上為ntohl()提供最有效的程序集,那就太棒了。 最終我的代碼也需要可移植到ARM。

x86-32和x86-64平台具有32位'bswap'匯編指令。 我不認為你會比一次手術更好。

uint32_t asm_ntohl(uint32_t a)
{
   __asm
    {
       mov eax, a;
       bswap eax; 
    }
}

查看匯編程序, __imp__ntohl@4是DLL的導入符號,因此它是一個外部函數,不能內聯。

當然你可以編寫自己的,甚至宏,知道你最有可能在小端機器上使用Windows,你只需要交換字節。

您可以在glib, gtypes.h頭文件中找到幾個高度優化的版本或多或少的可移植版本,宏GUINT32_SWAP_LE_BEglib.h

請參閱優化字節交換以獲得樂趣和利潤 它解釋了如何使它快速。

但我強烈建議你不要擔心它。 想想看 - 每次調用async_read ,ASIO都會分配一個內存來存儲處理程序的狀態,例如。 這比調用無辜的ntohl要昂貴得多,順便說一下,默認情況下在Linux中也是如此。 看起來你有一個過早的優化問題 - 你應該立即停止,否則你將浪費你的時間和資源。 畢竟 - 首先配置您的應用程序,然后優化它(建議使用vTune或TotalView)。

暫無
暫無

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

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