我只是在C++,所以我可能會做一些錯誤初學者,但反正我創建了一個C++ DLL,我把它從我的WPF項目:C#StringWriter比C++ ofstream(通過pinvoke)更快嗎?
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 + +更快?
感謝編輯神祕 – Yoav
您是否嘗試過運行一次可能比100次測試多1000倍的測試,以獲得更好的想法?最低可能需要大約10萬次迭代。 –
我同意這個基準是不夠的;實際上,這是一個非常糟糕的微觀基準。在任何情況下,請注意寫入IO時,緩衝通常非常重要(可能比原始CPU速度更爲重要)。 – 2012-06-19 21:34:46