我正在编写一个C#类来使用整数执行2D可分卷积,以获得比双对应更好的性能.问题是我没有获得真正的性能提升.
这是X过滤器代码(对于int和double两种情况都有效):
foreach (pixel)
{
int value = 0;
for (int k = 0; k < filterOffsetsX.Length; k++)
{
value += InputImage[index + filterOffsetsX[k]] * filterValuesX[k]; //index is relative to current pixel position
}
tempImage[index] = value;
}
Run Code Online (Sandbox Code Playgroud)
在整数情况"值"中,"InputImage"和"tempImage"是"int","Image <byte>"和"Image <int>"类型.
在双重"值"中,"InputImage"和"tempImage"是"double","Image <double>"和"Image <double>"类型.
(filterValues在每种情况下都是int [])
(类Image <T>是extern dll的一部分.它应该类似于.NET Drawing Image类..).
我的目标是通过int + =(byte*int)vs double + =(double*int)实现快速性能
以下时间是200次重复的平均值.
滤波器大小9 = 0.031(双精度)0.027(int)
滤波器大小13 = 0.042(双精度)0.038(int)
滤波器大小25 = 0.078(双精度)0.070(int)
性能提升很小.这可能是由管道停滞和次优代码引起的吗?
编辑:简化删除不重要的变量的代码.
编辑2:我认为我没有与缓存未命中相关的问题,因为"索引"遍历相邻的存储单元(逐行方式).此外,"filterOffstetsX"仅包含相对于同一行上的像素的小偏移,并且在滤波器大小/ 2的最大距离处.该问题可以存在于第二可分离滤波器(Y滤波器)中,但时间不是那么不同.