我需要從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
出於興趣,但你在灰度圖像上操作? –