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
这只是简单的数学…我做错了什么吗?
您的测试有缺陷。你只调用very short方法一次,几乎没有什么可测量的。测量中的波动(可变性)将高于计时本身。这将使您的第一个方法计时失效。
你应该调用doOne
十亿次,并将结果除以十亿,浮点数(不是整数)。
不确定如何解释第二个方法的时间。您可能会遇到这样的情况:. net在测试过程中进行垃圾收集,从而增加了大量的时间。这很容易检查。多次运行测试。如果是这样的话,大多数时间将彼此接近,只有少数异常值。
第二种方法也太短,不能没有环路测量。在每秒运行数十亿条指令的处理器上,10K的迭代几乎是不可测量的。