用于基准测试目的的C#编译器优化
发布时间:2020-12-15 17:18:11 所属栏目:百科 来源:网络整理
导读:我需要检查一些.NET API的性能,然后我想出了这段代码. Stopwatch sw = Stopwatch.StartNew();for (int i = 0; i 1000; i++) { int res = (int) SOME .NET FUNCTION TO RUN;}sw.Stop();double time = sw.Elapsed.TotalMilliseconds; 在我的第二个想法,我担心
我需要检查一些.NET API的性能,然后我想出了这段代码.
Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < 1000; i++) { int res = (int) SOME .NET FUNCTION TO RUN; } sw.Stop(); double time = sw.Elapsed.TotalMilliseconds; 在我的第二个想法,我担心编译器优化所有操作,因为res没有在任何地方使用.我修改了代码如下. Stopwatch sw = Stopwatch.StartNew(); long sumIt = 0; for (int i = 0; i < 1000; i++) { int res = (int) SOME .NET FUNCTION TO RUN; sumIt += res; } sw.Stop(); double time = sw.Elapsed.TotalMilliseconds; value = (int) sumIt / 1000; 有趣的是,似乎编译器并没有用我的第一个例子来优化操作.我用csc(Visual Studio)和单声道测试. 这是我的问题. >作为我的第一个例子制作基准是否安全? 添加 运行的一些功能实际上是运行的.NET功能,我修改了OP. 解决方法
如果编译器(JIT)发现它没有副作用,它可以优化整个函数调用.它可能需要能够内联函数来检测它.
我尝试了只对输入参数起作用的小函数,看看它是通过检查结果汇编来优化的(确保在未选中的情况下尝试使用“模块加载上的Suppres优化”的版本构建). ... for (int i = 0; i < 1000; i++) { int res = (int) Func(i); } ... static int Func(int arg1) { return arg1 * arg1; } 拆卸: for (int i = 0; i < 1000; i++) 00000016 xor eax,eax 00000018 inc eax 00000019 cmp eax,3E8h 0000001e jl 00000018 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |