Jos*_*osh 2 .net c# c++ benchmarking gdi+
我决定使用C#和C++中的图像进行基准测试,以确定在我正在考虑为自己制作的项目中使用哪种语言.
我预计基准测试非常接近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);
Run Code Online (Sandbox Code Playgroud)
C++代码几乎归结为:
QueryPerformanceCounter(&start);
Image * img = Image::FromFile(imagePath);
QueryPerformanceCounter(&stop);
delete img;
return (stop.QuadPart - start.QuadPart) * 1000.0 / freq.QuadPart;
Run Code Online (Sandbox Code Playgroud)
无论使用哪种语言,它们都需要以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);
}
Run Code Online (Sandbox Code Playgroud)
使用Image.FromStream()代替,您可以避免这种情况.
我想知道的是,如果你避免这种情况并尝试加载无效的图像文件,它会抛出OutOfMemory异常.
在C++中,你不做这样的检查.那么检查有多重要?任何人都可以给我一个避免这种情况会很糟糕的情况吗?
是的,你的基准是有缺陷的.问题是,你忘了真正做到与位图的东西.喜欢画它.
GDI +大大优化了图像的加载.与.NET优化加载程序集的方式非常相似.它完成了必要的事情,它读取文件的标题以检索基本属性.格式,宽度,高度,Dpi.然后,它创建一个内存映射文件,以创建到文件中像素数据的映射.但实际上并没有读取像素数据.
现在差异发挥作用.System.Drawing.Image接下来实际读取像素数据.这会导致页面错误,操作系统现在读取文件并将像素数据复制到RAM中.非常需要,如果文件有任何问题,那么你将在FromFile()调用时获得异常而不是一段时间后,通常是当你的程序绘制图像并埋没在你没有编写的框架代码中时.C#代码的基准标记乘以mmf的创建加上像素数据的读取.
C++程序总是需要为读取像素数据付费.但是你没有衡量,你只测量了创建MMF的成本.
| 归档时间: |
|
| 查看次数: |
951 次 |
| 最近记录: |