我发现 C 和 C# 中的类似代码之间存在巨大的性能差异。
C代码是:

#include <stdio.h>
#include <time.h>
#include <math.h>

main()
{
    int i;
    double root;

    clock_t start = clock();
    for (i = 0 ; i <= 100000000; i++){
        root = sqrt(i);
    }
    printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);

}
而 C#(控制台应用程序)是:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
            double root;
            for (int i = 0; i <= 100000000; i++)
            {
                root = Math.Sqrt(i);
            }
            TimeSpan runTime = DateTime.Now - startTime;
            Console.WriteLine("Time elapsed: " + Convert.ToString(runTime.TotalMilliseconds/1000));
        }
    }
}
使用上面的代码,C# 在 0.328125 秒内完成(发布版本),而 C 需要 11.14 秒来运行。
正在使用 mingw 将 C 编译为 Windows 可执行文件。
我一直假设 C/C++ 更快或至少与 C#.net 相当。究竟是什么导致 C 代码运行速度慢了 30 倍?
编辑:
看起来 C# 优化器正在删除根,因为它没有被使用。
我将根分配更改为 root += 并在最后打印出总数。
我还使用 cl.exe 编译了 C,并为最大速度设置了/O2 标志。
现在的结果是:
C 3.75 秒
C# 2.61 秒
C 仍然需要更长的时间,但这是可以接受的。

最佳答案

由于您从不使用“root”,编译器可能已经删除了优化您的方法的调用。

您可以尝试将平方根值累加到累加器中,在方法结束时将其打印出来,然后看看发生了什么。

编辑:见下面的 Jalf's answer

关于C# vs C - 巨大的性能差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/686483/

10-13 04:06