技术开发 频道

C#和C++哪个更高效?五方式图像计算实验

  在每个方法测试前,均运行一段DoSomething()清空高速缓存:

private static int[] 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呢?

0
相关文章