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

c#:使用不安全指针在double[]数组和另一个非double[]数组之间复制,c#,arrays,unsafe-pointers,C#,Arrays,Unsafe Pointers,我有一个很奇怪的问题,我想不出来。我正在使用创建缓冲区的第三方库。此缓冲区可以包含双精度数组,但在双精度数组之间进行复制时速度非常慢。对于特定的数据类型,必须在幕后进行某些操作,特别是在写入数据时。例如,以下操作可以工作,但需要20毫秒以上,而从一个双阵列复制到另一个双阵列需要20毫秒 Mitov.SignalLab.RealBuffer mitovBuffer = new Mitov.SignalLab.RealBuffer(16384); double[] doubleBuffer = ne

我有一个很奇怪的问题,我想不出来。我正在使用创建缓冲区的第三方库。此缓冲区可以包含双精度数组,但在双精度数组之间进行复制时速度非常慢。对于特定的数据类型,必须在幕后进行某些操作,特别是在写入数据时。例如,以下操作可以工作,但需要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];
    }
}
Mitov.SignalLab.RealBuffer=新的Mitov.SignalLab.RealBuffer(16384);
double[]doubleBuffer=新的双精度[16384];
专用无效测试()
{
对于(int i=0;i<16384;i++)
{
mitovBuffer[i]=双缓冲区[i];
}
}
这可以工作,但需要20毫秒以上的时间。我可以得到一个指向mitovBuffer的指针,我知道这个缓冲区中每个“double”存储8个字节。有什么方法可以在这两者之间复制吗?我尝试了所有常用的方法,如array.copy、块拷贝等。每次我都会遇到无法从“double[]转换为double”错误。
谢谢,Tom,这个函数运行缓慢的一个原因可能是
Mitov.SignalLab.RealBuffer
是可调整大小的delphi缓冲区的包装器。如果我正确理解了他们的文档,那么您正在执行的字节分配涉及抽象层,甚至可能涉及调整每个字节的缓冲区大小

API甚至说这个类是为了在Delphi代码中使用,而不是来自其他语言。API说

这是实(双)数据包装缓冲区。使用此缓冲区访问 并从Delphi代码内部操作真实(双重)数据。 .NET、C++ Builder和Visual C++用户应该多使用 方便且功能强大的TSLCRealBuffer

然而,他们的公共API并没有记录推荐的类。也许文档没有真正反映产品,但如果我是你,我会打电话给他们的工程师,了解你打算做什么。由于您无法固定它们的“缓冲区”抽象,我怀疑您不想使用非托管代码将字节推入这些位置

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

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

或者,您可以将数据转换为它们的内部格式,然后调用它们的公共过程
procedure AddCustom(AData:ISLData)

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

API甚至说这个类是为了在Delphi代码中使用,而不是来自其他语言。API说

这是实(双)数据包装缓冲区。使用此缓冲区访问 并从Delphi代码内部操作真实(双重)数据。 .NET、C++ Builder和Visual C++用户应该多使用 方便且功能强大的TSLCRealBuffer

然而,他们的公共API并没有记录推荐的类。也许文档没有真正反映产品,但如果我是你,我会打电话给他们的工程师,了解你打算做什么。由于您无法固定它们的“缓冲区”抽象,我怀疑您不想使用非托管代码将字节推入这些位置

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

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

或者,您可以将数据转换为它们的内部格式,然后调用它们的公共过程
procedure AddCustom(AData:ISLData)

Hi-Tom。如果您能够显示如何定义
RealBuffer
,则会更容易。使用
块复制
数组。复制
或p/invoke
memcpy
,然后根据您自己的需要对其进行性能测试,不安全的将
更快
,然后是直接元素复制,但是,对于较大的阵列,be fasterHi的大容量复制方法之一,是的,我了解这一点,但我不知道它是如何定义的。Blockcopy和Array.copy不起作用。错误如上所述。如果您没有
RealBuffer
的定义,我们无法帮助您使用批量版本,谁知道它正在进行哪些隐式操作,以及它正在进行哪些转换。在你得到它或者反编译它,或者知道内存是如何按字节/位存储的之前,你唯一的选择就是你在做什么。如果您能够显示如何定义
RealBuffer
,则会更容易。使用
块复制
数组。复制
或p/invoke
memcpy
,然后根据您自己的需要对其进行性能测试,不安全的将
更快
,然后是直接元素复制,但是,对于较大的阵列,be fasterHi的大容量复制方法之一,是的,我了解这一点,但我不知道它是如何定义的。Blockcopy和Array.copy不起作用。错误如上所述。如果您没有
RealBuffer
的定义,我们无法帮助您使用批量版本,谁知道它正在进行哪些隐式操作,以及它正在进行哪些转换。直到你得到它或者反编译它,或者知道内存是如何以字节/位的方式存储的,你唯一的选择就是你在做什么。我确实在寻找TSLCRealBuffer,但却找不到!谢谢克雷格。我确实在寻找TSLCRealBuffer,但却找不到!