我正在开发一个.NET框架来开发点对点应用程序。在之前的版本中,我用APM模式(BeginXXX / EndXXX)完成了它并且它工作得很好。我的意思是,我用VS分析器进行测量,结果是预期的,没有惊喜。
目前我正在更新它以使用.NET 3.5中引入的高性能改进,它是XXXAsync。然而,框架工作正常,当我看到探查器的结果(关于内存使用)时,Socket构造函数是“分配大多数内存的函数”中的前1名!
只是一个侧面评论:我期望第二个,ConnectionIoActor,它将是最高的一个,因为它创建一个新的字节[1<< 16](64Kb)。
我只用两个套接字测试它:监听器和一个接收连接,并确保套接字构造函数在重构之前不在该列表的顶部。对我来说没有任何意义,构造函数就是同一个!
无论如何,如果这对你来说没有意义,为什么套接字构造函数会分配那个内存?
更新1:
连接是预期的:
更新2:
有问题的套接字似乎是监听连接的那个。
更新3:
使用此代码可以重现它。在Main方法中,我分配一个100kb的数组只是为了确保我看到的是好的,而且是。
using System.Net;
using System.Net.Sockets;
namespace SocketMemeoryTest
{
class Listener
{
static void Main()
{
var forComparison = new byte[100*1024];
new Listener(3453).Start();
}
private readonly IPEndPoint _endpoint;
private readonly Socket _listener;
public Listener(int port)
{
_endpoint = new IPEndPoint(IPAddress.Any, port);
_listener = new Socket(_endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
}
public void Start()
{
_listener.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);
_listener.Bind(_endpoint);
_listener.Listen(4);
var saea = new SocketAsyncEventArgs();
var async = _listener.AcceptAsync(saea);
}
}
}
看,监听器套接字使用的内存比任何其他套接字都多(可能没什么,我不知道)。
这就是我所看到的:
可能我误解了一些东西,但无论如何,差不多150kb。这可以吗? 注意:在实际项目中,连接到它后,侦听器套接字需要超过200Kb。
答案 0 :(得分:0)
内存分配是由System.Net.Socket构造函数使用的System.Net.Logging引起的。禁用System.Net日志记录可能会有所帮助。 IMO没有什么可担心的。