【发布时间】:2011-11-22 06:04:47
【问题描述】:
您好,我正在使用 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。
【问题讨论】:
-
...而您使用的操作系统和平台是....?
-
顺便说一句,如果您使用 Boost ASIO 并认为调用
ntohl是性能瓶颈,那您就大错特错了 :) -
目前是 Windows 7 和 x64 平台,可能很快就会有 linux x64 平台。最终代码将在带有 linux 的 ARM Cortex-A9 平台上。
-
分析器告诉我它是。我只有一个套接字/一个线程及其读取 UDP 数据报,问题是数据速率接近 70MB/s 或 ~70,000 个数据包/s。软件 CRC 检查也是一个巨大的瓶颈,但它正在被转移到硬件中。
-
您确定您有一个自定义处理程序分配器来避免调用 malloc/free/new/delete 吗?如果不是,您的分析器如何显示您对
ntohl的调用而不是对malloc的调用?或者您可能会分析进程占用的 CPU 周期(不包括阻塞系统调用)?
标签: c++ inline boost-asio endianness