32.dll in unsafe c# faster than using .net sockets?

I'm building a message router and would like it to be as fast as possible. I want to stay within c# 4.0 and want to use sockets as fast as possible. I may not need to bring all the data into managed memory. I am dealing with byte arrays and am bringing the data into managed memory using this method (unless a better option is found): http://www.codeproject.com/KB/cs/ReadingStructuresEmit.aspx

Questions:

1) Is there a performance gain by using sockets in unsafe? how much?

2) Is there a pinvoke or data marshaling hit when using an unsafe method like this (with all structs unsafe as well)

public unsafe partial class Native 

{

    [DllImport("Ws2_32.dll")]
    public static extern int connect(SOCKET s, sockaddr_in* addr, int addrsize);

}

3) For #2, does it matter if the data processing happens in unsafe and when the unsafe method returns no data is returned (so maybe nothing is marshaled into managed)?


These kind of improvements just cannot have any measurable effect. The real work is done in kernel mode, the many layers in the TCP/IP driver stack. Lots of code there wants to take a sniff of the IRP packets. And ultimately it hits the NIC. That's where the real throttling happens. A one gigabit Ethernet interface is the common high end. That's peanuts compared to the rate at which a CPU can shovel data around. Even the slow RAM bus can easily move data 40 times faster. Not to speak of the latency involved with actually making a connection once it hits the network.

These paths are taken by ws2_32.dll as well as System.Net. You ought to measure it. My prediction is that you can't see a signal over the noise.


Any wrapper will introduce overhead, so yes, P/Invoking directly into the socket library will be faster. The question is how much faster.

Have you tried benchmarking each approach and seeing which performs better? That would be a pretty good way to determine this. If the performance difference is negligible, it would be better to stick to the managed socket classes and keep your code readable.

链接地址: http://www.djcxy.com/p/79186.html

上一篇: extern如何在C#中工作?

下一篇: 不安全的c#中的32.dll比使用.net套接字更快?