Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的内联ntohs()/ntohl()+;/助推ASIO 我使用C++ + Boost ASIO,我必须内联 ntoHL()/,原因是性能。每个数据包包含256个整数32,因此需要大量调用ntohl()。有人这样做过吗_C++_Inline_Boost Asio_Endianness - Fatal编程技术网

C+中的内联ntohs()/ntohl()+;/助推ASIO 我使用C++ + Boost ASIO,我必须内联 ntoHL()/,原因是性能。每个数据包包含256个整数32,因此需要大量调用ntohl()。有人这样做过吗

C+中的内联ntohs()/ntohl()+;/助推ASIO 我使用C++ + Boost ASIO,我必须内联 ntoHL()/,原因是性能。每个数据包包含256个整数32,因此需要大量调用ntohl()。有人这样做过吗,c++,inline,boost-asio,endianness,C++,Inline,Boost Asio,Endianness,以下是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()。任何帮

以下是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()
。任何帮助都将不胜感激


另外,我一直在考虑用C语言编写一个
#define
宏,它执行简单的int32桶移位(如果网络顺序与编译时的机器顺序不匹配)。如果有人知道并且能够为x86/x64体系结构上的
ntohl()
提供最高效的程序集,那就太棒了。最终,我的代码也需要能够移植到ARM。

x86-32和x86-64平台具有32位的“bswap”汇编指令。我不认为你会比一次手术做得更好

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

看看汇编程序,
\uu imp__ntohl@4
是来自DLL的导入符号,因此它是一个外部函数,不能内联

当然,您可以编写自己的宏,即使是宏,因为知道您最有可能在一台小型endian机器中使用Windows,您只需要交换字节

您可以在glib宏的
gtypes.h
标题中找到几个高度优化的版本,这些版本或多或少是可移植的: 请参阅。它解释了如何使它快速


但我强烈建议你不要再担心了。想想看——ASIO就是在每次调用
async\u read
时分配一个内存来存储处理程序的状态,举个例子。顺便说一句,这比调用innocent ntohl要昂贵得多,后者默认在Linux中内联。看起来你有一个过早的优化问题-你应该立即停止,否则你将浪费你的时间和资源。毕竟-首先评测应用程序,然后对其进行优化(建议使用vTune或TotalView)。

。。。您正在使用的操作系统和平台是……?顺便说一句,如果您使用Boost ASIO并认为调用
ntohl
是一个性能瓶颈,那么您就大错特错了:)Windows 7和x64平台目前,可能很快就会使用linux x64平台。最终代码将在linux的ARM Cortex-A9平台上发布。分析器告诉我确实如此。我只有一个套接字/一个线程,它读取UDP数据报,问题是数据速率接近70MB/s或~70000个数据包/s。软件CRC检查也是一个巨大的瓶颈,但它正被转移到硬件中。您确定您有一个自定义处理程序分配器,可以避免调用malloc/free/new/delete吗?如果不是,您的探查器如何显示您对
ntohl
的调用,而不是对
malloc
的调用?或者您可以分析进程占用的CPU周期(不包括阻止系统调用)?我在线程内使用sync_read来避免malloc并传递相同的预分配缓冲区。你说得对,我在过早地优化。我也将查看vTune for sure,谢谢@马克:告诉你吧——你并不是在逃避内存分配,即使你使用相同的线程和预先分配的缓冲区。对async_read的调用需要额外的状态与操作相关联,ASIO正在为此隐式分配/释放内存,除非您有自定义处理程序分配器。所以你走的路是正确的-首先是概要文件:-)哦,我在上一篇文章中说了
sync\u read
,但实际上我打的是
m\u socket.receive\u from(boost::asio::buffer(m\u packet\u buffer),m\u remote\u ep)
,因此没有内存分配?我认为它应该直接映射到BSD样式的套接字调用?@Mark:Oops,对于sync调用,可能没有alloc,因为您没有必须以异步方式调用的回调,但您必须仔细检查。Asio是非常纯粹的执行者,因此保持警惕:)谢谢,工作几乎完美无瑕,只是Microsoft编译器在堆栈中插入了两条备份
a
的指令,所以我使用了内在的
\u byteswap\u ulong()
如果允许,我可以切换到英特尔编译器。:)MSVC不支持x64/amd64上的内嵌程序集。Intel从ATOM开始引入movbe指令,但桌面CPU也支持此指令。建议使用CPUID测试此功能。movbe可用于从内存加载数据到寄存器,并将其视为big-endian。其他人需要注意的是:glib.h针对x86和GNU C编译器进行了优化,针对它执行的其他体系结构/编译器