c++比c#的计算速度快15倍,这是合法的吗?

本文关键字:15倍 计算 速度快 c++ | 更新日期: 2023-09-27 18:18:23

这是我第一次尝试编写本地c++代码,然后从c#中调用函数,以测试我听说的在插入/调用代码时的开销。测试是简单的数学计算,首先是单次运行,然后是10K次循环迭代。

class Program
{
    [DllImport("ExportTest.dll", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
    public static extern void doWarmUp();
    [DllImport("ExportTest.dll", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
    public static extern int doOne();
    [DllImport("ExportTest.dll", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
    public static extern int doLongOne();
    static void Main(string[] args)
    {
        doWarmUp();
        Stopwatch sw = new Stopwatch();
        int test;
        sw.Reset();
        sw.Start();
        test = csdoOne();
        sw.Stop();
        Console.WriteLine("Res CsdoOne:{0} ", sw.ElapsedTicks);
        sw.Reset();
        sw.Start();
        test = doOne();
        sw.Stop();
        Console.WriteLine("Res C++ doOne :{0} ", sw.ElapsedTicks);

        sw.Reset();
        sw.Start();
        test = doLongOne();
        sw.Stop();
        Console.WriteLine("Res C++ doLongOne:{0}'tTics: {1} ", test, sw.ElapsedTicks);
        sw.Reset();
        sw.Start();
        test = csdoLongOne();
        sw.Stop();
        Console.WriteLine("Res C# doLongOne:{0}'tTics: {1} ", test, sw.ElapsedTicks);
        Console.Read();
    }
    static int csdoOne()
    {
        int res;
        res  = 5 * 4;
        return res;
    }
    static int csdoLongOne()
    {
        int r1, r2;
        r1 = 0; r2 = 0;
        for (int i = 0; i < 10500; i++)
        {
            r1 = (5 * 4);
            r2 = i * 2;
            r1 += r2;
        }
        return r2;
    }
}

如果有兴趣看c++代码,我也会贴出来的。我没有这样做,因为它实际上是完全相同的代码在两个函数预热函数只是void doWarmUp(){ return;},因为我注意到只有第一次调用才有任何开销。

结果是惊人的,因为我真的很喜欢c#

Res Cs doOne:  4
Res C++ doOne: 17
Res c++ doLongOne: 21018        Tics: 30
Res C#  doLongOne: 21018        Tics: 446

这只是简单的数学…我做错了什么吗?

c++比c#的计算速度快15倍,这是合法的吗?

您的测试有缺陷。你只调用very short方法一次,几乎没有什么可测量的。测量中的波动(可变性)将高于计时本身。这将使您的第一个方法计时失效。

你应该调用doOne十亿次,并将结果除以十亿,浮点数(不是整数)。

不确定如何解释第二个方法的时间。您可能会遇到这样的情况:. net在测试过程中进行垃圾收集,从而增加了大量的时间。这很容易检查。多次运行测试。如果是这样的话,大多数时间将彼此接近,只有少数异常值。

第二种方法也太短,不能没有环路测量。在每秒运行数十亿条指令的处理器上,10K的迭代几乎是不可测量的。