2

我只是 c++ 的初学者,所以我可能做错了什么,但无论如何我创建了一个 c++ dll,并从我的 wpf 项目中调用它:

C++代码:

extern "C" __declspec (dllexport) double writeTxt()
{   
    ofstream mf("c:\\cpp.txt");     
    for(int i=0;i<999;i++)
    {
     mf<<"xLine: \n";
    }
    mf.close();
    return 1;

}

从 c# 调用代码:

[DllImport(@"C:\Users\neo\Documents\visual studio 2010\Projects\TestDll\Debug\TestDll.dll",
       CallingConvention = CallingConvention.Cdecl)]
    public static extern double writeTxt();

现在我正在尝试将执行时间与这个 c# 函数进行比较:

double writeTxtCs()
    {
        StreamWriter sw = new StreamWriter(@"c:\cs.txt");
        for (int i = 0; i < 999; i++)
        {
            sw.WriteLine("Line: " + i);
        }
        sw.Close();
        return 0;
    }

但是 c# 函数的速度大约是 c++ 函数的两倍。
像这样测试:

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        long[] arr = new long[100];
        Stopwatch sw = new Stopwatch();
        for (int i = 0; i < 99; i++)
        {
            sw.Start();
            //double xxx = writeTxt();
            double xxx = writeTxtCs();
            arr[i] = sw.ElapsedMilliseconds;
            sw.Reset();
        }
        MessageBox.Show(arr.Average().ToString());
        Close();
    }

运行 c# 函数时,我通常会得到 ~0.65ms,而运行 c++ 函数时,我会得到 ~1.1ms。
我的问题是:我做错了什么还是在这种情况下 c# 真的比 c++ 更快?

4

4 回答 4

4

您不是在测试 C++ 与 C#。您正在测试 [C++ plus 库] 与 [C# plus 库]。

为了找出 ofstream 比 StreamWriter 慢的原因,您需要分析代码或查看内部结构。

无论如何,一毫秒对于计算机来说是非常小的时间。我会以 1000 倍的负载重复测试,以使时序抖动无关紧要。

于 2012-06-19T21:32:07.930 回答
4

所有其他答案都有有效点。除此之外:

您正在针对 C++ DLL 的“调试”构建进行测试,这可能会降低 C++ 性能,而不是它对 C# 性能的影响。尝试对两者进行优化,看看效果如何。

尽管如此,I/O 与“语言”并没有多大关系。它更多的是关于运行时和操作系统。

于 2012-06-19T21:42:11.613 回答
2

这可能是一个缓冲问题,即 C# 和 C++ 文件写入内容可能以不同的方式缓冲数据,这会导致性能差异。

我建议您使用纯粹受 CPU 限制的基准测试操作,而不是受 IO 限制的操作(例如写入硬盘驱动器)。例如,查看每个函数从 0 计数到 MAX_INT 的速度。

于 2012-06-19T21:33:07.650 回答
2

这不是一个真正可靠的基准。你在那里做文件IO,这高度依赖于ofstream和StreamWriter的实现。还有,有问题吗?

于 2012-06-19T21:34:24.533 回答