К сожалению, ответ гораздо более приземленный, чем эти предложения, хотя они и помогают. По сути, я запутался в том, как у меня дела с хронометражем.
Временной код, который я использовал, был таким:
Ipp32s timer;
ippGetCpuFreqMhz(&timer);
Ipp64u globalStart = ippGetCpuClocks();
globalStart = ippGetCpuClocks() *2 - globalStart; //use this method to get rid of the overhead of getting clock ticks
//do some stuff
Ipp64u globalEnd = ippGetCpuClocks();
globalEnd = ippGetCpuClocks() *2 - globalEnd;
std::cout << "total runtime: " << ((Ipp64f)globalEnd - (Ipp64f)globalStart)/((Ipp64f)timer *1000000.0f) << " seconds" << std::endl;
Этот код специфичен для компилятора Intel и предназначен для обеспечения чрезвычайно точных измерений времени. К сожалению, такая предельная точность означает стоимость примерно 2,5 секунды на цикл. Удаление временного кода сняло это временное ограничение.
Тем не менее, кажется, что время выполнения все еще задерживается - код сообщит о 0,24 с при включенном временном коде, и теперь сообщает о времени примерно 0,35 с, что означает, что скорость составляет около 50%.
Изменение кода на это:
static extern void ImageProcessing(
IntPtr inImage, //[MarshalAs(UnmanagedType.LPArray)]ushort[] inImage,
IntPtr outImage, //[MarshalAs(UnmanagedType.LPArray)]ushort[] outImage,
int inYSize, int inXSize);
и называется как:
unsafe {
fixed (ushort* inImagePtr = theInputImage.DataArray){
fixed (ushort* outImagePtr = theResult){
ImageProcessing((IntPtr)inImagePtr,//theInputImage.DataArray,
(IntPtr)outImagePtr,//theResult,
ysize,
xsize);
}
}
}
уменьшает время выполнения до 0,3 с (в среднем три запуска). Все еще слишком медленный для моих вкусов, но повышение скорости в 10 раз, безусловно, в рамках приемлемости для моего босса.