我发现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秒.

C正在使用mingw编译成Windows可执行文件.

我一直认为C/C++更快,或者至少与C#相当.网到底是什么导致C代码运行速度慢了30倍?

编辑:

现在的结果是:

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

推荐答案

由于您从未使用"root",编译器可能已经删除了优化方法的调用.

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

编辑:见下文Jalf's answer

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

我可以动态分配具有空类型函数的矩阵吗?

带双指针的2D数组

%p与char* 等组合缺少的GCC Wform警告

从组播组地址了解收到的数据包长度

C编译器是否遵循restrict的正式定义?

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

为什么cudaFree不需要数据 struct 的地址?

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

FRIDA-服务器成为端口扫描的目标?

如何在C中使数组变量的值为常量?

如何在POSIX-UEFI中获得输入?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

为什么WcrTomb只支持ASCII?

如何在C中用bool进行文件I/O?

从整型转换为浮点型可能会改变其值.

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

变量值不正确的问题

struct 中的qsort,但排序后的 struct 很乱

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤