私は、C# と C++ でイメージの読み取りをベンチマークして、自分で作ろうと考えているプロジェクトで使用する言語を決定することにしました。
ベンチマークは C++ と非常に近いものになると予想していましたが、おそらくわずかに先行しています。
C# コードは各実行に約 300 ミリ秒かかります (私は各テストを 100 回実行しました)、C++ コードは約 1.5 ミリ秒かかります。
私の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++ では、このようなチェックは行いません。では、このチェックはどれほど重要なのでしょうか。これを避けるのが悪い状況を誰か教えてもらえますか?