C#vs C

我发现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: %fn", ((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标志设置为最大速度。

现在的结果是:3.75秒C 2.61秒C#

C仍然需要更长的时间,但这是可以接受的


由于您从不使用'root',因此编译器可能会删除调用以优化您的方法。

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

编辑:请参阅下面的Jalf的答案


您必须比较调试版本。 我刚刚编译你的C代码,并得到

Time elapsed: 0.000000

如果你不启用优化,你所做的任何基准测试都是毫无价值的。 (如果你确实启用了优化,循环会得到优化,所以你的基准代码也是有缺陷的,你需要强制它运行循环,通常是总结结果或类似结果,并在最后打印出来)

看来你所测量的基本上是“哪个编译器插入了最多的调试开销”。 原来答案是C.但那并不能告诉我们哪个程序是最快的。 因为当你想要速度时,你可以启用优化。

顺便说一句,如果您放弃任何语言比其他语言“更快”的概念,那么您将长期节省很多头痛。 C#没有比英语更快的速度了。

在C语言中有一些东西即使在一个天真的非优化编译器中也是有效的,还有一些东西在很大程度上依赖于编译器来优化所有东西。 当然,对于C#或任何其他语言也是如此。

执行速度取决于:

  • 您正在运行的平台(操作系统,硬件,系统上运行的其他软件)
  • 编译器
  • 你的源代码
  • 一个好的C#编译器会生成高效的代码。 一个糟糕的C编译器会生成慢速代码。 怎么样一个生成C#代码的C编译器,然后你可以通过C#编译器运行? 运行速度有多快? 语言没有速度。 你的代码确实。


    我会保持简短,它已经标记为答案。 C#具有定义良好的浮点模型的巨大优势。 恰好与x86和x64处理器上的FPU和SSE指令集的本机操作模式相匹配。 那里没有巧合。 JITter将Math.Sqrt()编译为一些内嵌指令。

    本机C / C ++具有多年的向后兼容性。 / fp:precise,/ fp:fast和/ fp:strict编译选项是最明显的。 因此,它必须调用实现sqrt()的CRT函数并检查选定的浮点选项以调整结果。 这很慢。

    链接地址: http://www.djcxy.com/p/82149.html

    上一篇: C# vs C

    下一篇: C# internal static extern with InternalCall attribute