c# - 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++ Dll 中将块存储为 BlockData***,然后使用 PInvoke 读取/写入它们是否比将它们存储在 C# 数组中更有效?
不,因为 P/Invoke 有很大的开销,而 C# .NET 中的数组访问是由 JIT 在运行时编译为具有边界检查的相当有效的代码。.NET 中的锯齿状数组也有足够的性能(.NET中唯一的薄弱环节是真正的多维数组,这令人失望——但我不相信你的提议也会有所帮助)。
更新: .NET Core中的多维数组性能实际上似乎比.NET Framework 差(如果我正确阅读了这个线程)。
推荐阅读
- ios - 如何在 UIContainerView 内导航
- google-cast - Android 开始投射到从自定义投射对话框中选择的设备
- django - 带有两个外键的 Django 查询
- android - 寻呼机指示器颤动
- java - 是否可以调用本机查询并将结果集存储在非实体对象中?
- c# - 在 Windows 10 IoT Core 上访问 USB 端口
- angular - 以 angular6 形式排除输入 formControlName
- excel - 如何在 Excel 中使用两个过滤器提取数据?
- sql-server - 使用 SQL Server 清除一些表,同时将停机时间降至最低
- arrays - 将数组传递给 Vue 中的 Laravel 视图