0

简单: List<float[]> +List<int[]> List<object>两者都进行强制转换?哪个会提供更好的性能?差异非常显着吗?


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

  1. 将它们放在多个列表中
  2. 将它们放在多个通用列表中:List<float[]>List<int[]>
  3. 将它们放在一个中List<object>并将数组转换为对象并返回

问题是通用和铸造有多慢/快? 或者我如何有效地存储我的数组?


添加:所有数组都是“重”计算的主题。Singleintfloat值不会在彼此之间转换。它们仅在计算完成时相互影响。float 为我的计算提供了足够的准确性,不需要加倍。(数组大小最大为 600。但这可以改变。

4

2 回答 2

2

Know What Things Cost列出了各种托管操作的典型时间。如果您将它们解释为相对的,并对它们持保留态度,那么它们在各代处理器中是相对稳定的。

但要注意:我还不明白为什么它将双加列为比浮点加慢。底层指令是相同的(或者我最后一次检查,IIRC) - 这可能是记忆效应,或者是托管代码特有的东西。

确保浮点数具有足够的精度。Mul/div 很好,但是重复的 add/sub 精度损失会迅速累积。快速、错误的结果是没有用的——尤其是在它们没有明显错误的情况下。

通常我会默认加倍并使用浮点数,前提是我可以确保准确度足够,并且我有确凿的证据表明我会遇到内存访问问题(例如内部循环超过典型的 L1/L2 缓存大小,或性能测量)。

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

非通用列表是出路。

于 2013-07-04T07:52:02.840 回答
0

我会这样做bluh[i] as TheTypeINeed,而不是真正担心它。列出整个列表似乎很愚蠢。

我还要注意以下几点:

  • 您一直在进行 int/float (EDIT)cast 有什么原因吗?
  • 对于这样一个性能要求很高的应用程序,C# 是您真正想要的语言吗?

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

于 2013-07-04T07:55:38.133 回答