2014-06-19 77 views
0

對於我需要高速計算的新項目,我試圖在C++和C#之間進行選擇。我一直聽說C#在速度上是合理的。我知道C和C++比較慢,但我的例外是差別不大!所以我用C++和C#編寫了兩個代碼來自己測試它們。C++和C#速度測試 - 奇怪的結果

C++的結果大約是5:09到5:55秒,而C#的結果是11408到11960秒。

因此,我的代碼有問題,或者這是真的嗎? 這裏是我的C++代碼:

clock_t tStart = clock(); 
std::ofstream myfile; 
myfile.open("log.txt"); 
std::string pi; 

int limit = 50; 
for (int i = 0; i < limit; i++) 
{ 
    for (int j = 0; j < limit; j++) 
    { 
     for (int k = 0; k < limit; k++) 
     { 
      double val = sin(i *i + j *j + k *k); 
      pi = std::to_string(val); 
      myfile << pi<<"\n"; 
     } 
    } 
} 
myfile.close(); 
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC); 
getchar(); 
return 0; 

,這裏是我的C#代碼:

Stopwatch stopwatch = new Stopwatch(); 
stopwatch.Start(); 
string path = @"c:\log.txt"; 
int limit = 50; 
for (int i = 0; i < limit; i++) 
{ 
    for (int j = 0; j < limit; j++) 
    { 
      for (int k = 0; k < limit; k++) 
      { 
       double val = Math.Sin(i *i + j *j + k *k); 
       using (StreamWriter sw = File.AppendText(path)) 
       { 
        sw.WriteLine(val.ToString("F6")); 
       } 
      } 
    } 
} 
stopwatch.Stop(); 
Console.Write(stopwatch.ElapsedMilliseconds); 
Console.ReadKey(true); 

我的操作系統是64位的Win7。 預先感謝您的時間。

@EDIT:爲什麼要改變 double val = Math.Sin(i * i + j * j + k * k); 至 double val = Math.Sin(i^2 + j^2 + k^2);在C#中使用 ,會產生完全不同的答案?

+5

請注意,您在循環內部打開文件 - 在你的C++版本不同。 –

+0

哇,是的,你是對的。我改變了這一點,現在C#的結果是** 44毫秒**這是令人難以置信的。那麼C++現在有什麼問題? – NESHOM

+0

@ M0HS3N你確定你正在編譯啓用優化嗎? – user657267

回答

3
for (int j = 0; j < limit; j++) 
{ 
    for (int k = 0; k < limit; k++) 
    { 
     using (StreamWriter sw = File.AppendText(path)) 
     { 
      //... 
     }   
    } 
} 

您的結果並不令人驚訝 - 你打開文件,並創建,並在每次迭代處置StreamWriter。你應該創建它一次:

using (StreamWriter sw = File.AppendText(path)) 
{ 
    for (int j = 0; j < limit; j++) 
    { 
     for (int k = 0; k < limit; k++) 
     { 
       //... 
     } 
    } 
} 
+0

謝謝,我已經糾正了這一點,現在C#的結果是44毫秒,這很好。那麼現在我的C++代碼出了什麼問題? – NESHOM

+0

@ M0HS3N不要使用std :: to_string,myfile << val <<「\ n」;就足夠了。 – cqdjyy01234

+0

我刪除了std :: string,現在好多了:700毫秒。在釋放模式下,它比160 ms更好,但仍比44 ms的C#慢。任何其他想法? – NESHOM

2

測試中的最大的區別是,C++的一個,打開和關閉文件外循環,這意味着只發生1次。

在您的C#測試中,您將打開該文件,執行文件查找到最後,然後在每次迭代中關閉它。這將是一個巨大的時間。

您應該將創建的Streamwriter移至循環上方,然後在退出循環後關閉它。

我指的代碼

 using (StreamWriter sw = File.AppendText(path)) 
     { 
      sw.WriteLine(val.ToString("F6")); 
     }