通常在大数据量计算的应用程序里,CPU大部分时间处理等待状态.在一个单线程的应用程序里,这些查询会导致window消息处理能力阻塞,这里会导致计算时间很长,CPU利用率也非常低.
最近一直在研究,提高处理性能的方法.
开始利用,多线程,异步的方法来实现,
下面的语句是用来分段进行数据整合, (如按天,或按月,对中间数据进行整合)整合SQL通过批量生成
在单线程的执行时间,CPU利用率一般在1-10%,(服务器HP 580 4 CPU XEON 3.0G 16G内存,加盘柜),这样整合时间太长。
如果分段整合,CPU利用率就在40-80%得到比较大的利用。
不过上面程序也有一点问题,就是异步线程数据没有好的控制。如果同时执行线程,过多,CPU时间片分配就不合理,执行速度反而慢。
后来就一直想用线程池的来合理处理线程。
。Net自带的线程池使用起来比较简单。
通过System.Threading.ThreadTool类就可以使用,
定义回调方法
WaitCallback async = new WaitCallback(FExeute);
通过ThreadPool.QueueUserWorkItem(async,service);加入队列
回调方法执行运算
其中Interlocked.Decrement,是调用原子操作,进行减操作,
Interlocked.Increment(ref number);是调用原子操作,进行加
原子操作在多线程中不会有冲突。
线程池有几点好处,
1。多线程执行,
2。根据CPU个数,性能等,合理安排执行的线程,(在实际操作过程中,通过SQL SERVER企业管理器中查看当前活动的进程数,可以看到当前正在执行的线程数)
3。异步操作。
相关资源:
http://www.ddvip.net/program/c-/index2/15.htm
http://www.codeproject.com/csharp/threadtests.asp
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/NECLRT.mspx
源码下载:
https://files.cnblogs.com/edobnet/Report.rar