Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C程序需要快速访问C++中的大数据集_C#_Arrays_Com_Marshalling - Fatal编程技术网

C# C程序需要快速访问C++中的大数据集

C# C程序需要快速访问C++中的大数据集,c#,arrays,com,marshalling,C#,Arrays,Com,Marshalling,我有一个C程序,想处理一些浮点数据。数据来自于C++代码,它是64位COM EXE,而C程序是32位。我可以使用SAFEARRAY来回传递数据,但速度非常慢 我认为理想的解决方案是在C端分配一个浮点数组。使用m_FastRowPinHandle=GCHandle.AllocmyArray,GCHandleType.pinted; 若要将C数组插入,然后使用本机C++代码获取指向该内存的指针并将浮点复制到该数组中。 我有一个例程,使用SAFEARRAY来回传递数据,花了10.5秒来处理数据。当我把

我有一个C程序,想处理一些浮点数据。数据来自于C++代码,它是64位COM EXE,而C程序是32位。我可以使用SAFEARRAY来回传递数据,但速度非常慢

我认为理想的解决方案是在C端分配一个浮点数组。使用m_FastRowPinHandle=GCHandle.AllocmyArray,GCHandleType.pinted; 若要将C数组插入,然后使用本机C++代码获取指向该内存的指针并将浮点复制到该数组中。 我有一个例程,使用SAFEARRAY来回传递数据,花了10.5秒来处理数据。当我把数据处理改成并行使用时,因为我把处理从6.5秒改为1.5秒,但是总时间从10.5秒到5.5秒,因为用SaaErEAR将数据从C++侧传输到C端需要4秒。 调用COM时是否必须使用SAFEARRAY?如果不是正确的IDL,这样我就可以访问本地C++侧的MyFrasRoPin HooLe.ADDROFPNEDDION对象了吗?这会更快吗?似乎不应该花费4秒来封送1GB的浮点数据

谢谢,,
Rick Wirch

使用共享内存、管道、套接字等将数据作为原始字节传递。不是一个安全的数组使其速度变慢,它必须跨越进程边界。更大的阵列将有助于减少开销,但在进行此过程时,您永远无法接近所获得的速度。嗨,谢谢Hans。我想这意味着我已经被拧紧,必须重写C到C++的一堆代码。我已经尝试过调整两个世界之间缓冲区的大小,但速度差别很小。它使用了大约600000个浮点数和更大浮点数之间的缓冲区。试着做缓冲区32 MB,它只使它快到20%。我猜我正在寻找答案,但也许没关系,如何使用McFaskRoopPrdLe.AdRoFoPNEndObjor对象,它是C++中COM端的类型。使用IntPtr需要什么IDL?我认为这可能会有所帮助的原因是,当我分析时,花在memcpy上的时间很少。另外,从一个进程到另一个进程传递1GB内存似乎需要4秒的时间。