我決定用C#和C++來讀取圖像的基準,以決定在我正在考慮爲自己製作的項目中使用哪種語言。我預計基準與C++的關係可能會非常接近,可能會略微推進。GDI +圖像比C#快得多圖像
C#代碼每次運行大約需要300ms(每次運行100次),其中C++代碼大約需要1.5ms。
那麼我的C#代碼是否錯誤?我的基準測試很糟糕嗎?或者它真的太慢了?
這裏的C#代碼我使用:
Stopwatch watch = new Stopwatch();
watch.Start();
Image image = Image.FromFile(imagePath);
watch.Stop();
Console.WriteLine("DEBUG: {0}", watch.ElapsedMilliseconds);
以及C++代碼幾乎歸結爲:
QueryPerformanceCounter(&start);
Image * img = Image::FromFile(imagePath);
QueryPerformanceCounter(&stop);
delete img;
return (stop.QuadPart - start.QuadPart) * 1000.0/freq.QuadPart;
無論哪種語言,他們需要在一個Image對象落得,因爲它提供了我將需要的功能。
============================================= ==========================
xanatos在註釋中指出,Image.FromFile確實會檢查。
更具體地說,本:
num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero));
if (num != 0)
{
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero));
throw SafeNativeMethods.Gdip.StatusException(num);
}
使用Image.FromStream()來代替,就可以避免這一點。
我想知道的是,如果你確實避免這一點,並嘗試加載無效的圖像文件,它會引發OutOfMemory異常。
而在C++中,你不要這樣檢查。那麼這個檢查有多重要?任何人都可以給我一個避免這種情況不好的情況嗎?
兩者都以相同的方式做同樣的事情。檢查你使用的方法的內部實現('Image.FromFile'和'Image :: FromFile')。也許有差異。但爲你的需要,因爲你看到'C++'是最好的選擇(如果開發時間不比性能更重要) – Leri 2012-07-18 14:18:15
我希望你在沒有附加調試器的情況下以發佈模式運行你的項目(CTRL + F5) – xanatos 2012-07-18 14:24:59
@xanatos yes當然。 – Josh 2012-07-18 14:28:24