【发布时间】:2012-01-03 01:36:26
【问题描述】:
我非常了解option 的好处,但在这种情况下,出于性能原因,我想避免使用option。 option 将一个类型包装在一个类中,这意味着垃圾收集器需要做更多的工作——我想避免这种情况。
尤其是在这种情况下,我有多个字段在相同的情况下都是Some,但我不想把它们放在一个元组中,因为元组也是类——并且对GC。所以我最终访问了field.Value——这违背了option的目的。
因此,除非有我不知道的优化导致option 类型被视为可能为空的引用,否则我只想使用null。有没有办法让我做到这一点?
编辑:为了扩展我正在做的事情,我正在制作一个bounding volume hierarchy,它实际上是一棵二叉树,数据仅在叶节点处。我将它作为一个类而不是作为一个受歧视的联合来实现,因为出于性能原因保持项目不可变不是一种选择,并且受歧视的联合不能有 mutable 成员,只有 refs - 再次,添加到 GC 压力。
虽然在函数式语言中很愚蠢,但我最终可能只是将每个节点类型都作为Node 父类型的继承。 Downcasting 并不是最快的操作,但就 XNA 和 WP7 而言,几乎任何事情都比激怒 GC 更好。
【问题讨论】:
-
您确定增加的 GC 压力在您的情况下真的很重要吗?
-
@svick 是的,不幸的是,它用于 XNA 游戏的碰撞检测——这意味着它最终可能会在 WP7 或 Xbox 360 上运行,它们都有一代 GC。
-
"给 GC 带来了额外的压力。" - 你测量过这个吗?
-
@Mitch 不,但我已经测量了在粒子系统中使用元组对 GC 的影响。它非常难看,即使在 x64 .NET 4 上也是如此。切换到自定义结构元组会大大增加我可以模拟的粒子数量。
-
我不能完全理解你想要做什么,但除了 null 或选项类型之外,可能还有其他方法。也许您可以详细说明您的用例,我们或许可以找到第三种方法。