Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算速度高达15倍c++;vs C#这合法吗? 这是我第一次尝试生成一个本地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#_C++_Performance_Native_Computation - Fatal编程技术网

计算速度高达15倍c++;vs C#这合法吗? 这是我第一次尝试生成一个本地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; } }

计算速度高达15倍c++;vs C#这合法吗? 这是我第一次尝试生成一个本地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#,c++,performance,native,computation,C#,C++,Performance,Native,Computation,这只是简单的数学。。。我做错什么了吗?你的测试有缺陷。您只调用了一次非常短的方法,几乎没有什么可测量的。测量中的波动(可变性)将高于计时本身。这将使您的第一个方法计时无效 您应该调用doOne10亿次,并将结果除以10亿,以浮点数(而不是整数)计算 不知道如何解释第二种方法计时。你可能遇到其中一个罕见的时刻:.NET是在测试过程中的垃圾回收,增加了大量的时间。这很容易检查。多次运行测试。如果是这样的话,大多数计时将彼此接近,只有少数异常值 另外,第二种方法也太短,无法在没有回路的情况下进行测量。

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

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

您应该调用
doOne
10亿次,并将结果除以10亿,以浮点数(而不是整数)计算

不知道如何解释第二种方法计时。你可能遇到其中一个罕见的时刻:.NET是在测试过程中的垃圾回收,增加了大量的时间。这很容易检查。多次运行测试。如果是这样的话,大多数计时将彼此接近,只有少数异常值


另外,第二种方法也太短,无法在没有回路的情况下进行测量。在每秒运行数十亿条指令的处理器上,很难测量10K次迭代。

doOne
可能是一个noop,静态解析为
20
。另外,这两个DLL都是通过优化编译的吗?反汇编后。在编译时,我得到了C++版本的代码> MOV EAX,20998 < /COD>,因此测量将几乎100%的噪声和开销。虽然很明显,C++中的某些动作要快得多(或者任何其他语言都不必考虑.NET框架之类的大的东西,以及它所暗示的一切)。另一方面,C+++C++有很多优点。从如此简单的测试(即使假设这些结果是正确的)中得出一般结论(=计算速度提高15倍)并不太合理。是的,你做了一些错误的事情。不做任何有用的分析代码会生成无用的分析结果。C++编译器的优化器完全消除了循环,因为它完全是不必要的,只需返回2×10499。.NET抖动中的优化器永远不会移除循环,这是一个设计选择,它只能移除无用的R1任务。@ RoTEM滑稽,因为我不确定C++没有优化。然而c#虽然是默认的优化代码v
Res Cs doOne:  4
Res C++ doOne: 17
Res c++ doLongOne: 21018        Tics: 30
Res C#  doLongOne: 21018        Tics: 446