在每个方法测试前,均运行一段DoSomething()清空高速缓存:
{
int[] data = new Int32[20000000];
for (int i = 0; i < data.Length; i++)
{
data[i] = i;
}
return data;
}
测试结果(每个执行5次,计算耗时总和。单位ms):
图像1——
BitmapData:53
ArgbImage8:80
ArgbImage32:38
EmguCV:68
OpenCV:69
图像2——
BitmapData:25
ArgbImage8:45
ArgbImage32:19
EmguCV:42
OpenCV:45
图像3——
BitmapData:8
ArgbImage8:25
ArgbImage32:6
EmguCV:23
OpenCV:24
图像4——
BitmapData:48
ArgbImage8:76
ArgbImage32:39
EmguCV:67
OpenCV:69
图像5(大图:5000×6000)——
BitmapData:1584
ArgbImage8:1991
ArgbImage32:1229
EmguCV:1545
OpenCV:2817
下面删去ArgbImage8,仅比较剩下的4种(每个执行5次,计算耗时总和。单位ms):
图像6——
BitmapData:17
ArgbImage32:10
EmguCV:25
OpenCV:25
图像7——
BitmapData:88
ArgbImage32:56
EmguCV:69
OpenCV:70
图像8——
BitmapData:41
ArgbImage32:25
EmguCV:40
OpenCV:43
图像5(大图:5000×6000)——
BitmapData:2855
ArgbImage32:1849
EmguCV:1578
OpenCV:2522
下面,把执行顺序颠倒一下,让EmguCV和OpenCV在前面。剩下的2个在后面:
图像8——
EmguCV:41
OpenCV:42
BitmapData:38
ArgbImage32:26
图像9——
EmguCV:32
OpenCV:34
BitmapData:28
ArgbImage32:18
好了,不做试验了。根据上面结果,再考虑到纯C/C++程序比P/Invoke程序性能高一些,可得出这样的结论(在我的机器上):
(1)C#不直接用指针比P/Invoke 的 C/C++程序低效一些。
(2)C#直接用指针,可以写出非常高效的程序,至少比P/Invoke高效。从上面的代码可看出,C#下指针用很舒服,并且编译快。猜想:C#下玩指针+Struct,和C没啥区别。图像处理这样的基本类型简单的程序,非常适合用C#编写。大量用指针,大量用非托管内存,可以最大化性能,最小化内存占用,最小化GC对程序的影响,达到和C/C++所差无几的性能。
下面尝试直接使用硬件。对图像处理加速最有效果的是GPU,好吧,下面就尝试调用GPU的功能。
如何在无界面的情况下调用GPU呢?