.net - NET] 为什么小于 16 字节的结构更好

标签 .net

我正在研究 .NET 结构 - 如果实例大小小于 16 字节,有些书建议创建结构。

这是为什么?

最佳答案

这是因为 16 字节是编译器开始将结构复制为内存块而不是使用一两个简单的移动指令的阈值。

当结构较小时,编译器会优化结构的复制。例如 8 个字节的结构可以复制为单个 64 位值。一个 16 字节的结构可以被复制为一个或两个奇异值(取决于处理器架构)。当结构大于 16 字节时,编译器不再尝试优化移动,回退是调用复制一 block 内存的方法。

(注意:16 字节的阈值可能因编译器的版本而异,似乎它实际上试图在较新的版本中优化超过该点,但与复制引用相比,优化后的代码仍然会有很多移动指令到仍然是单次移动操作的对象。)

编辑:
这是我在 64 位系统上复制结构十亿次的测试结果:

struct 4    : 272 ms.
struct 8    : 235 ms.
struct 16   : 317 ms.
struct 32   : 625 ms.
struct 64   : 1280 ms.
struct 128  : 4659 ms.
struct 256  : 8020 ms.

如您所见,16 字节以下的时间不是线性的,虽然 16 字节是 4 字节的四倍,但它不会花费四倍的时间。超过 16 个字节的时间是线性的,因此将大小加倍是时间的两倍。这就是它开始使用多个 Action 的地方。超过 64 字节时有一个跳跃,当大小翻倍时,时间突然翻了两番。这就是开始使用后备的地方。

关于.net - NET] 为什么小于 16 字节的结构更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2437925/

相关文章:

如果第二次启动,C# 程序只能运行一次 + BringToFront

.net - TPL数据流和Akka.net有什么区别?

.net - 平台目标(x86/x64/任何 CPU)对于纯托管 .NET DLL 文件重要吗?

c# - 如何关闭闪屏?

.net - 将正则表达式与一个单词的可变长度后视和另一个单词的可变长度负后视相匹配?

c# - 使用 Azure Service Fabric 与自定义 Azure 云的优缺点?

.net - WIX 将新文件添加到共享组件

c# - 如何获得看起来像没有选项卡的 TabControl 的控件?

c# - 如何并行读取队列中的消息?

.net - .NET 中的大 float (单个)