C#StringWriter比C ++ ofstream(通过pinvoke)更快?

时间:2012-06-19 21:27:32

标签: c# performance visual-c++ dll pinvoke

我只是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 个答案:

答案 0 :(得分:4)

你没有测试C ++和C#。您正在测试[C ++ plus libraries]与[C#plus libraries]。

为了找出为什么ofstream比StreamWriter慢,你需要分析代码或查看内部。

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

答案 1 :(得分:3)

所有其他答案都有效点。除了那些:

您正在测试C ++ DLL的“Debug”版本,这可能会降低C ++性能,而不是影响C#的性能。尝试释放两者的优化,看看它是如何为你工作的。

然而,I / O与“语言”没什么关系。它更多的是关于运行时和操作系统。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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