C#中实现并发的几种方法的性能测试
0x00 起因
去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块。当时的做法很简单,服务端等待链接,有用户接入后开启一个线程,在线程中运行一个while循环接收数据,接收到数据就处理。用户退出(收到QUIT命令)后线程结束。程序一直运行正常(当然还要处理“TCP粘包”、消息格式封装等问题,在此不作讨论),不过随着使用的人越来越多,而且考虑到线程开销比较大,如果有100个用户链接那么服务端就要多创建100个线程,500个用户就是500个线程,确实太夸张了(当然实际并没有那么多用户)。由于TCP通信并不是每时每刻都在进行着的,因此可以把所有客户端连接存储到一个列表中,通过轮询的方式依次开启一个线程进行数据接收,接收完毕后释放线程,这样可以充分利用线程池,避免大量线程消耗内存和CPU。
轮询的方式通过线程池实现了线程的复用,可以肯定的是在资源开销上肯定是小很多的,但轮询的方式在单位时间内的处理次数会不会比保持线程的方式少很多呢,本测试将解决这个疑问。
0x01 实验方法
IDE:VS2015
.Net Framework 4.5
接收数据的对象如下所示
通过ReceiveData方法接收数据,每次接收只有1%的可能性收到数据,通过创建N个对象接收数据来模拟一个TCP