[英]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_BE
: glib.h
請參閱優化字節交換以獲得樂趣和利潤 。 它解釋了如何使它快速。
但我強烈建議你不要擔心它。 想想看 - 每次調用async_read
,ASIO都會分配一個內存來存儲處理程序的狀態,例如。 這比調用無辜的ntohl要昂貴得多,順便說一下,默認情況下在Linux中也是如此。 看起來你有一個過早的優化問題 - 你應該立即停止,否則你將浪費你的時間和資源。 畢竟 - 首先配置您的應用程序,然后優化它(建議使用vTune或TotalView)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.