在Blazor Server应用中使用Stopwatch为何会导致代码执行变慢?
Stopwatch导致代码执行变慢的原因
这是.NET JIT编译器优化策略差异引发的现象,核心原因如下:
JIT激进优化被抑制
仅使用DateTime.UtcNow计时时,JIT编译器会识别到循环逻辑(result++执行10亿次)没有实际外部副作用,直接将整个循环优化为result += 1000000000的赋值操作,实际执行时间极短,所以你看到约250ms的耗时。引入
Stopwatch后,编译器会判定这段代码的执行时长需要被精确测量,因此禁用了这类激进的循环消除优化,让循环真正执行10亿次,耗时自然大幅提升至约750ms。执行上下文的影响
Stopwatch依赖硬件高精度计时器实现,它的存在会改变代码的执行上下文提示,让JIT无法应用循环消除、循环展开等优化。而DateTime.UtcNow精度较低,编译器不会因它的存在放弃优化。
验证方法
你可以通过强制让result产生外部副作用来验证这个结论:
void OnCalcClick() { var start = DateTime.UtcNow; for (long i = 0; i < 1000000000; i++) result ++; var stop = DateTime.UtcNow; time = (stop - start).TotalMilliseconds; // 让result被外部使用,阻止JIT优化循环 Console.WriteLine(result); }
此时仅用DateTime.UtcNow计时的耗时会和使用Stopwatch时基本一致,因为编译器无法再优化掉循环的实际执行流程。
内容的提问来源于stack exchange,提问作者Eugeniy Maksimov
相关产品推荐
相关产品推荐

