我需要从 ushort arrayB 中具有相同长度的相应索引值中快速减去 ushort arrayA 中的每个值。
另外,如果差为负,我需要存储一个零,而不是负差。
(确切地说,长度 = 327680,因为我要从另一个相同大小的图像中减去 640x512 图像)。
下面的代码目前需要约 20 毫秒,如果可能的话,我希望将其降低到约 5 毫秒。不安全的代码是可以的,但请提供一个例子,因为我在编写不安全的代码方面并不是很熟练。
谢谢!
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"));
}
更新:虽然它不是严格意义上的 C#,但为了其他阅读本文的人的利益,我最终使用以下代码将 C++ CLR 类库添加到我的解决方案中。它的运行时间约为 3.1 毫秒。如果使用非托管 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"));
}