铸造或通用列表有多慢?

时间:2013-07-04 06:41:40

标签: c# arrays list generics casting

简单: List<float[]> + List<int[]> vs。 List<object>两者都投了? 哪个会提供更好的性能?差异非常重要吗?

<小时/> 我有一个非常依赖性能的Windows应用程序用C#编写(虽然不是实时)。我正在使用数组列表,可以是float[]int[]。所以我在想如何最好地使用它们:

  1. 将它们放在多个列表中
  2. 将它们放在多个通用列表中:List<float[]>List<int[]>
  3. 将它们放在一个List<object>中并将数组转换为对象并返回
  4. 问题是通用和投射的速度有多慢? 或者如何有效地存储我的阵列?

    <小时/> ADD:所有数组都经过“重”计算。单intfloat值不会相互转换。它们只在计算完成时相互影响。 float为我的计算提供了足够的准确性,不需要双倍。 (数组大小最多为600.但这可能会改变。

2 个答案:

答案 0 :(得分:2)

Know What Things Cost列出了各种托管操作的典型时间。如果你将它们解释为 relative 并将它们带入一粒盐,那么它们在处理器代之间相对稳定。

但要注意:我还没有理解为什么它列出double add比float add慢。底层的指示是相同的(或者我最后检查过,IIRC) - 这可能是记忆效应,或者特定于托管代码的东西。

确保浮点数具有足够的准确度。 Mul / div很好,但重复的加/减精度损失会很快累积。快速,错误的结果是没有用的 - 特别是如果它们显然是错误的

通常我会默认加倍并使用float只有在我能确保准确性足够的时候才能证明我会遇到内存访问问题(比如内部循环超过典型的L1 / L2缓存大小或性能)测量)。

List<float[]>与多个列表相比应该没有明显的区别,前提是阵列不是很小,并且您没有经常调整大小。

非通用列表是出路。

答案 1 :(得分:0)

我会做bluh[i] as TheTypeINeed,而不是真的担心它。铸造整个清单似乎很愚蠢。

我还会注意以下内容:

  • 你有没有理由一直在进行int / float(EDIT)投射?
  • C#是您真正想要的这种性能要求高的应用程序吗?

我觉得在架构层面上还有其他更基本的问题。