阻止套接字send()调用时间成本

时间:2018-10-13 08:50:10

标签: sockets send

美好的一天! 似乎为阻止套接字而调用send()函数仅需将应用程序缓冲区复制到内核驱动程序网络缓冲区中。我认为如果驱动程序缓冲区为空,它必须非常快。它只需花费一次系统调用(上下文更改)。

在我的系统上,一个简单的系统调用大约需要2500 tsc计数器滴答声〜0.5-1.0 mcs。

但是我的测量结果与上述结论相矛盾。

这是代码示例。

uint32_t garb;
uint64_t t0 = __rdtscp(&garb); 

iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);

uint64_t t1 = __rdtscp(&garb);

std::cout << "CORE SENT (" << (t1 - t0)/1000  << "k ticks)\n" << std::flush;

我曾在Windows 10系统上使用VS2015编译器和MSYS2(MingW)gcc编译器尝试发送过这样的代码,并发送了小数据(例如约14个字节)。在所有情况下,此类代码成本(t1-t0)约为100k-350k滴答,平均约为250k滴答。估计它的成本约为25-80 mcs,平均为60 mcs。它不只是简单的系统调用+内存复制。发送呼叫时间永远不会低于100k滴答声,而且似乎没有任何缓存丢失。

这是正常行为吗?你能解释一下吗?可能是send函数需要另外一些开销。为什么发送呼叫时间总是比简单的系统调用+内存复制更耗费时间。我的系统有问题吗?在Linux系统上花费相同吗?

0 个答案:

没有答案