gpt4 book ai didi

c# - TcpClient 的创建是否有很多开销?

转载 作者:太空狗 更新时间:2023-10-30 00:46:48 26 4
gpt4 key购买 nike

我尝试使用 TcpClient 发送/接收数据。我做了两个实验,发现了一些有趣的东西。

我在日本的服务器中设置了 TcpListener,在英国设置了 TcpClient。我一直向 TcpListener 发送 500 个字节,当 TcpListener 将 10KB 发送回 TcpClient 时。在每个实验中,我将此发送/接收循环保持 500 次。

实验一:

在每个发送/接收循环中,我创建一个全新的 TcpClient(创建前的时间)并发送/接收

实验二:

对于所有循环,我只有一个 TcpClient,它保持与 TcpListener 的连接并进行 500 次发送/接收。

结果:

一个循环的时间成本的平均值:

E1:1.8 秒,E2:0.49 秒。

这个结果让我很吃惊。所以保持连接以不断发送/接收可以节省很多时间???将近 2/3 的时间。

这是真的吗???

谢谢

====新的====

@Jon Skeet,@dbemerlin,感谢您的回复。我猜 Tcp 握手需要一些时间工具。

所以我做了实验3。

我设置一个 HttpListener 作为服务器并使用 WebClient 发送/接收,数据大小完全相同。每次我使用新的 WebClient 在英国和日本之间发送/接收时。

结果是 0.86(500 次循环的平均值,即发送/接收)。

我假设 WebClient/HttpLisener 本身就是 Tcp,对吗?在我的实验中,它们如何比原始 TcpClient/TcpListener 更快?

再次感谢

最佳答案

这并不特别令人惊讶,但这不是创建对象的成本 - 这是建立 TCP 连接、握手等的成本。

如果您可以在一个连接上完成大量工作,那比每次都建立一个新连接更有效率。用现实世界的术语来说,考虑两个人之间的电话交谈。

高效场景:你拨号码,他们接听,你说话,他们回复,你说话,他们回复等等。

低效场景:你调用号码,他们接听,你通话,他们回复,你挂断。然后您立即再次调用该号码,他们接听,您通话,他们回复,您挂断等等。

想象一下在现实中做后者!你会很快发疯的......

编辑:默认情况下,WebClient 将保持与 Web 服务器的挂起连接打开。如果您强制重置连接(基本上禁用 KeepAlive),那么您将再次看到缓慢的行为。

关于c# - TcpClient 的创建是否有很多开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com