【发布时间】:2011-04-21 12:09:56
【问题描述】:
如果我有结构数组MyStruct[]:
struct MyStruct
{
float x;
float y;
}
而且它比我做 float[] -> x = > i; 慢y => i + 1(所以这个数组比结构体大 2 倍)。
10,000 个项目的时间差相互比较(内部有两个 fors):结构 500 毫秒,只有浮点数的数组 - 78 毫秒
我想,该结构看起来像例如。 float、int 等(在堆上)。
【问题讨论】:
-
您为什么不继续向我们展示您的基准测试代码?
-
请注意,当我测试它时,使用
foreach循环迭代MyStruct[]所需的时间大约是使用 for 循环的两倍。 -
基准代码绝对是必须的,但我也想指出,在.net中,数组是一种引用类型,所以原语数组仍然在堆上(无论是int/float/whatever 或结构)。你仍然可以获得一些好处,因为如果你有一个对象数组,当你调用 objarr[0].ToString() 时,它实际上是两个引用查找,一个查找对对象的引用数组,另一个引用查找来获取到对象。
-
@Brian -
foreach在数组上得到特殊处理,并且不比for慢。不知道如果你使用多态会发生什么,例如IEnumerable<float> floats = new [] { 1f };,所以如果编译器/运行时仍然能够优化它。 -
@JulianR:我听说过,但由于某种原因我尝试它时仍然较慢。如果您想尝试,我发布了我的代码。 stackoverflow.com/questions/3867331/…
标签: c# performance struct