首页 > 解决方案 > C# 数组访问与 C++ PInvoke 指针访问

问题描述

我有一个优化大型锯齿状数组的想法。假设我进入了 c# 数组

struct BlockData
{
    internal short type;
    internal short health;
    internal short x;
    internal short y;
    internal short z;
    internal byte connection;
}
BlockData[][][] blocks = null;
byte[] GetBlockTypes() 
{
   if (blocks == null)
      blocks = InitializeJaggedArray<BlockData[][][]>(256, 64, 256);
//BlockData is struct
MemoryStream stream = new MemoryStream();
for (int x = 0; x < blocks.Length; x++)
{
    for (int y = 0; y < blocks[x].Length; y++)
    {
       for (int z = 0; z < block[x][y].Length; z++)
       {
           stream.WriteByte(blocks[x][y][z].type);
       }
    }
}
return stream.ToArray();
}

将块存储为BlockData***C++ Dll,然后使用 PInvoke 读取/写入它们是否比将它们存储在 C# 数组中更有效?

笔记。我现在无法执行测试,因为我的电脑现在正在服务中。

标签: c#c++

解决方案


在 C++ Dll 中将块存储为 BlockData***,然后使用 PInvoke 读取/写入它们是否比将它们存储在 C# 数组中更有效?

不,因为 P/Invoke 有很大的开销,而 C# .NET 中的数组访问是由 JIT 在运行时编译为具有边界检查的相当有效的代码。.NET 中的锯齿状数组也有足够的性能(.NET中唯一的薄弱环节是真正的多维数组,这令人失望——但我不相信你的提议也会有所帮助)。

更新: .NET Core中的多维数组性能实际上似乎.NET Framework 差(如果我正确阅读了这个线程)


推荐阅读