在我的项目中,我正在使用用户决定长度的对象数组(object [])。在应用程序的过程中,它也至少每秒循环数百次。这个数组还有一个与之关联的类,它确保对它的任何添加都将使用一个为每个占用的元素设置一个位的数组来填充第一个空缺点。一旦分配的数组条目保持在原位,因为它会影响元素的跟踪以移动它们,因此可能存在间隙。可以删除或添加的元素数量是未知的。与循环访问元素相比,添加和删除发生的频率要低得多。
我需要知道的是,当循环通过这个数组时,哪个会提供更好的平均性能......
- 检查每个条目是否为空
或者
调用以下代码以获取循环中的下一个索引,以检查 -1 是否停止。Tracker 包含元素的按位位置。该函数只需要为每个填充元素运行一次。&= 行和下一行的减法产生最低位集的整数值。DeBruijn 序列位执行对数基数 2 以获得位位置。
private List<Int32> Tracker = new List<Int32>(); private int EnumTemp; private int EnumTemp2; private int EnumResult; private int EnumIndex = -1; //from http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn protected internal static readonly Int32[] MultiplyDeBruijnBitPosition2 = { 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 }; public int NextIndex() { if (EnumIndex == -1) { EnumTemp = Tracker[0]; EnumIndex = 0; } while (EnumTemp == 0) { if (EnumIndex == Tracker.Count -1) { EnumIndex = -1; return -1; } EnumIndex++; EnumTemp = Tracker[EnumIndex]; } EnumTemp2 &= EnumTemp - 1; EnumResult = Engine.MultiplyDeBruijnBitPosition2[(UInt32)((EnumTemp-EnumTemp2) * 0x077CB531U) >> 27]; EnumResult += (EnumIndex * 32); EnumTemp = EnumTemp2; return EnumResult; } }
假设在这两种情况下都将访问数组元素并将其存储在临时变量中。