【发布时间】:2013-12-22 01:06:34
【问题描述】:
我严重怀疑 C# 或 .NET JIT 编译器是否执行任何有用的优化,更不用说它们是否真的与 C++ 编译器中最基本的竞争。
考虑一下这个极其简单的程序,我很方便地把它做成在 C++ 和 C# 中都有效:
#if __cplusplus
#else
static class Program
{
#endif
static void Rem()
{
for (int i = 0; i < 1 << 30; i++) ;
}
#if __cplusplus
int main()
#else
static void Main()
#endif
{
for (int i = 0; i < 1 << 30; i++)
Rem();
}
#if __cplusplus
#else
}
#endif
当我在最新版本的 C# (VS 2013) 中以发布模式编译和运行它时,它不会在任何合理的时间内终止。
编辑:这是另一个例子:
static class Program
{
private static void Test2() { }
private static void Test1()
{
#if TEST
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2(); Test2();
#else
Test2();
#endif
}
static void Main()
{
for (int i = 0; i < 0x7FFFFFFF; i++)
Test1();
}
}
当我运行这个时,如果 TEST 被定义,它需要 很多 更长的时间,即使一切都是空操作并且应该内联 Test2。
即使是最古老的 C++ 编译器我也能掌握,但是,优化一切,让程序立即返回。
是什么阻止了 .NET JIT 优化器进行如此简单的优化?为什么?
【问题讨论】:
-
用户在 JIT 优化器运行时正在等待,因此他们通常只执行您通常可以期望成本低且回报高的优化。
-
消除不执行的代码。这个循环执行,所以它是定义的实时代码。
-
@CatPlusPlus:不,这不是定义。您应该阅读 Wikipedia 中关于消除死代码的第一句和第二句。
-
@CatPlusPlus:如果你没有一个好的答案,你就没有有回答这个问题。我也没有,这就是我问这个问题的原因。也许其他人会,我们都可以学习。
-
@CatPlusPlus 天哪,如果只有编译器作者能够获得您的智慧。如果他们知道消除死代码毫无意义,他们本可以节省大量时间。奇怪的是他们继续花时间改进它,你不觉得吗?他们一定很愚蠢
标签: c# c++ .net performance optimization