c#:使用不安全指针在 double[] 数组和另一个不是 double[] 的数组之间复制

c#: Copying between a double[] array and another array which is not a double[] using unsafe pointers

我有一个很奇怪的问题,我无法弄清楚。我正在使用创建缓冲区的第三方库。这个缓冲区可以包含双精度但在双精度数组之间复制并且速度非常慢。一定有特定数据类型在幕后发生的事情,特别是当您写入它时。例如,以下工作但需要超过 20 毫秒,而从双精度数组复制到另一个双精度数组需要 20 微秒。

Mitov.SignalLab.RealBuffer mitovBuffer = new Mitov.SignalLab.RealBuffer(16384);
double[] doubleBuffer = new double[16384];

private void Test()
{
    for (int i=0; i < 16384; i++)
    {
         mitovBuffer[i] = doubleBuffer[i];
    }
}

这有效,但需要 20 多毫秒。我可以获得指向 mitovBuffer 的指针,并且我知道此缓冲区中的每个 "double" 存储了 8 个字节。有没有办法在这两者之间复制?我已经尝试了所有常见的方法,例如 array.copy、块副本等。每次我都收到无法从 "double[] to double" 转换的错误。 谢谢,汤姆

也许这个功能慢的原因之一是因为 Mitov.SignalLab.RealBuffer 是可调整大小的 delphi 缓冲区的包装器。如果我正确理解了他们的文档,那么您正在执行的按字节分配涉及抽象层,甚至可能涉及为每个字节调整缓冲区大小。

API 甚至说 class 旨在用于 Delphi 代码,而不是来自其他语言。 API 表示

This is Real(double) Data wrapper buffer. Use this buffer to access and manipulate the Real(double) data from inside your Delphi code. .NET, C++ Builder and Visual C++ users should use the much more convenient and powerful TSLCRealBuffer class.

但是,他们的public API 并没有那个推荐的文档class。也许文档并没有真正反映产品,但如果我是你,我会打电话给他们的工程师,看看你打算做什么。由于您无法固定他们的 "buffer" 抽象,我怀疑您不想使用非托管代码将字节推送到这些位置。

如果你想尝试按字节加载,也许你可以尝试他们记录的按字节方法:

function GetByteSize() : Cardinal - Returns the size of the buffer in bytes.
function GetSize() : Cardinal - Returns the size of the buffer in elements.
function ByteRead() : PByte
function ByteWrite() : PByte
function ByteModify() : PByte

或者您可以将数据放入他们的内部格式,然后调用他们的 public 过程 procedure AddCustom(AData : ISLData)