2012-06-19 57 views
2

我只是在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 + +更快?

+0

感謝編輯神祕 – Yoav

+1

您是否嘗試過運行一次可能比100次測試多1000倍的測試,以獲得更好的想法?最低可能需要大約10萬次迭代。 –

+0

我同意這個基準是不夠的;實際上,這是一個非常糟糕的微觀基準。在任何情況下,請注意寫入IO時,緩衝通常非常重要(可能比原始CPU速度更爲重要)。 – 2012-06-19 21:34:46

回答

3

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

您正在針對C++ DLL的「調試」版本進行測試,這可能會降低C++的性能,而不是影響C#的性能。嘗試釋放兩者的優化,看看它是如何爲你工作的。

儘管如此,I/O與「語言」沒有多大關係。這更多的是關於運行時和操作系統。

+1

把兩個項目都改變成發佈模式就有所不同。 我會繼續測試它,但現在C++函數比c#函數快10倍。 – Yoav

4

你沒有測試C++與C#。您正在測試[C++ plus庫]與[C#plus庫]。

爲了找出爲什麼ofstream比StreamWriter慢,你需要剖析代碼或查看內部。

無論如何,單毫秒對於一臺計算機而言是非常少量的時間。我會用1000倍的負載重複測試,以使時序抖動無關緊要。

+0

我試圖增加10來調用函數的for循環,但差別只是越來越大。 – Yoav

+0

差異越來越大意味着你的舊基準是錯誤的。差異應該保持不變。嘗試增加負載甚至更多。進入秒範圍。 – usr

2

它可能是一個緩衝問題,即C#和C++文件寫入內容可能以不同方式緩存數據,這會導致性能差異。

我建議你使用一種純粹CPU接口進行基準測試的操作,而不是IO界限(比如寫入硬盤)。例如,看看每個函數從0到MAX_INT的計數有多快。

+1

這樣的基準測試語言就是廢話。你無法將結果用於任何事情。這純粹是人造的。然後用 – usr

+0

混合算術加條件。 – Wug

+1

每種語言都沒有一個分數。每種語言和每個工作量都有一個分數。您需要選擇一組代表性負載。這很難。 – usr

2

這不是一個真正可靠的基準。你在那裏做文件IO,這很大程度上依賴於ofstream和StreamWriter的實現。另外,這是一個問題嗎?