为何控制台应用运行NUnit测试比ReSharper慢5倍?
为什么ReSharper跑测试比控制台应用快5倍
- 核心原因是运行时GC模式的配置差
ReSharper 2020.2版本的测试宿主进程,默认在启动测试前会把当前应用域的GC切换为服务端GC(Server GC)。这种GC模式会给每个CPU核心分配独立的内存堆和专用GC线程,多核心并行回收,内存分配吞吐率比控制台应用默认的工作站GC高3-5倍,和你测出来的20秒vs4秒的差距完全匹配。
你只要在控制台应用的App.config里加上下面的配置,直接跑程序就能复现和ReSharper一样的速度:<configuration> <runtime> <gcServer enabled="true" /> <gcConcurrent enabled="true" /> </runtime> </configuration> - 次要影响是JIT编译的优化程度差
ReSharper的测试宿主是常驻的长期运行进程,加载完你的程序集之后,会提前把测试方法以及所有关联的依赖方法,全部预编译成最高优化等级的机器码;而控制台应用启动后是边跑边编译,循环1000万次的热路径PerformMovesB,是第一次进入循环的时候才被JIT编译,初始编译为了减少启动耗时,用的是低优化等级的机器码。
顺带提一句你代码里的低效点:PerformMovesB每轮循环都new一个List<int>(3)存被移除的三个数,1000万次循环就生成1000万个短生命周期的List对象,平白给GC加了很多负担,换成三个固定的int变量存值,还能再提30%左右的速度。 - 已经排除的无效排查方向
你之前查的32/64位差异、Release/Debug编译差异、项目配置差异都不是根源——你已经验证了两个环境都是64位进程、都是Release编译,生成的dll/exe是完全一样的,差异100%来自运行时的进程环境配置,不是编译产物的问题。
内容的提问来源于stack exchange,提问作者Anlo
相关产品推荐
相关产品推荐

