【发布时间】:2014-01-16 00:55:16
【问题描述】:
我需要快速从 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"));
}
【问题讨论】:
-
~20ms 听起来相当慢(也许你的机器规格低?)。 以防万一,您是否在没有调试的情况下运行发布版本?
-
p/invoke 并使用 PSUBW?
-
不感兴趣,但您是在灰度图像上操作吗?
-
@GeoffBattye:我的机器是 Win7 64 位 i5。我正在运行调试版本。
-
@nick_w:是的,我正在处理灰度图像。
标签: c# arrays performance subtraction ushort