使用visual studio 2012内置的performance analysis tool对编译得到的wordcounter.exe文件进行cpu采样分析。测试数据为大小为92.4mb的文件夹,得到采样图:
可以发现,耗时最长的函数分别为String.SplitInternal(),String.ToLower(),JIT_MonReliableEnter(线程得到锁)以及字典类的findEntry()操作,让人意外的是,加锁操作耗时竟然大于字典类操作....分词操作耗时最长,对于此处的优化,可以考虑采用自己的split函数实现。下面考虑调整分词统计线程的数目,看看不同的线程数对结果有何影响。
对于统计一个大小在100mb左右的文件夹,得到如下结果
分词线程数10,运行时间15秒
分词线程数5,运行时间13秒
分词线程数3,运行时间11秒
分词线程数1,运行时间16秒
不同的分词线程数目对程序性能有较大影响,根据比对,将程序分词线程数目调整为3.
以上是本次作业在性能优化方面的一些心得,之前,我只用过java开发过多线程程序,C#下的多线程编程尚不熟练,这次作业,性能调优花费了我很大的时间(2h),但也得到了并发程序设计的基本经验。目前我在看《Java Concurrency in Practice》,其实Java与C#在很多层面是相通的,至少是在语言层面,但是,对于两者虚拟机(HotSpot与JIT)的内存模型的联系与区别,我尚不了解。同时,我对C#的ConcurrentDictionary类也不了解,它同Java下的同名类的实现实现手段的区别尚不清楚,今后需要多加学习。