我需要从ushort arrayB中相应长度的索引值中快速减去ushort arrayA中的每个值。如何从C#中快速减去另一个ushort数组?
另外,如果差值是负值,我需要存储一个零值,而不是负值差值。
(长度= 327680是准确的,因为我从另一幅相同尺寸的图像中减去640x512图像)。
下面的代码目前正在使用〜20ms,如果可能的话,我想在〜5ms以内。不安全的代码是可以的,但请提供一个例子,因为我在编写不安全的代码方面没有超强的技巧。
谢谢!
public ushort[] Buffer { get; set; }
public void SubtractBackgroundFromBuffer(ushort[] backgroundBuffer)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int bufferLength = Buffer.Length;
for (int index = 0; index < bufferLength; index++)
{
int difference = Buffer[index] - backgroundBuffer[index];
if (difference >= 0)
Buffer[index] = (ushort)difference;
else
Buffer[index] = 0;
}
Debug.WriteLine("SubtractBackgroundFromBuffer(ms): " + sw.Elapsed.TotalMilliseconds.ToString("N2"));
}
UPDATE:虽然它不是严格的C#,别人谁读这个的好处,我终于结束了加入了C++ CLR类库我用下面的代码的解决方案。它运行在〜3.1ms。如果使用非托管C++库,它运行在〜2.2ms。由于时差很小,我决定去托管的图书馆。
// SpeedCode.h
#pragma once
using namespace System;
namespace SpeedCode
{
public ref class SpeedClass
{
public:
static void SpeedSubtractBackgroundFromBuffer(array<UInt16>^buffer, array<UInt16>^backgroundBuffer, int bufferLength);
};
}
// SpeedCode.cpp
// This is the main DLL file.
#include "stdafx.h"
#include "SpeedCode.h"
namespace SpeedCode
{
void SpeedClass::SpeedSubtractBackgroundFromBuffer(array<UInt16>^buffer, array<UInt16>^backgroundBuffer, int bufferLength)
{
for (int index = 0; index < bufferLength; index++)
{
buffer[index] = (UInt16)((buffer[index] - backgroundBuffer[index]) * (buffer[index] > backgroundBuffer[index]));
}
}
}
然后我把它称为是这样的:
public void SubtractBackgroundFromBuffer(ushort[] backgroundBuffer)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
SpeedCode.SpeedClass.SpeedSubtractBackgroundFromBuffer(Buffer, backgroundBuffer, Buffer.Length);
Debug.WriteLine("SubtractBackgroundFromBuffer(ms): " + sw.Elapsed.TotalMilliseconds.ToString("N2"));
}
〜20ms的声音很慢(也许你的机器是低规格?)。 *以防万一*,您是否正在运行发布版本而不进行调试? – Ergwun
p /调用并使用PSUBW? – Yaur
出于兴趣,但你在灰度图像上操作? –