【发布时间】:2016-01-22 09:24:08
【问题描述】:
我正在开发的应用程序非常注重性能,因此需要将分配保持在最低限度以保持 GC 停止。
我惊讶地发现System.Guid 没有公开任何将其byte[] 表示复制到现有缓冲区的方法。现有的唯一方法Guid.ToByteArray() 执行new byte[] 分配,否则没有它就无法获取底层字节。
所以我正在寻找一种将Guid 复制到已经存在的byte[] 缓冲区而不分配任何内存的方法(因为Guid 已经是一个值类型)。
【问题讨论】:
-
你真的需要
Guid吗?也许只是直接创建[DllImport("ole32.dll", SetLastError=true)] static extern int CoCreateGuid(byte[] guid);(或pinvoke.net/default.aspx/rpcrt4/UuidCreateSequential.html)? -
不幸的是,是的。问题不是我需要创建一个 Guid,而是我已经有一个 Guid 的实例,我需要在不分配中间缓冲区的情况下进入现有字节数组。
-
请注意,在 gc 语言中,这种分配几乎没有成本(增加托儿所指针)。除非您在一个操作中处理大量数字,否则 pinvoke 甚至固定可能不会更广泛
-
分配不是伤害你的东西。这是最终的垃圾收集成本。
标签: c# memory optimization