我决定在 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++ 中,您不会进行这样的检查。那么这个检查有多重要呢?谁能给我一个避免这种情况不好的情况?