I'm seriously doubting if the C# or .NET JIT compilers perform any useful optimizations, much less if they're actually competitive with the most basic ones in C++ compilers.
Consider this extremely simple program, which I conveniently made to be valid in both C++ and 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
When I compile and run it in the newest version of C# (VS 2013) in release mode, it doesn't terminate in any reasonable amount of time.
Edit: Here's another example:
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();
}
}
When I run this one, it takes a lot longer if TEST
is defined, even though everything is a no-op and Test2
should be inlined.
Even the the most ancient C++ compilers I can get my hands on, however, optimize everything away, making the programs return immediately.