我感觉使用GetEnumerator()和强制类型转换IEnumerator.Current是很耗费性能的。有更好的建议吗?
如果有其他数据结构可以提供类似的功能并且具有更好的性能,我也可以接受。
想法:
使用泛型栈是否会更好,这样就不需要进行强制类型转换了?
我感觉使用GetEnumerator()和强制类型转换IEnumerator.Current是很耗费性能的。有更好的建议吗?
如果有其他数据结构可以提供类似的功能并且具有更好的性能,我也可以接受。
想法:
使用泛型栈是否会更好,这样就不需要进行强制类型转换了?
Stack<T>
(带foreach)确实可以省去类型转换,但是在总体上实际装箱并不是那么糟糕。如果您有性能问题,我怀疑这不是您可以增加多少价值的领域。使用分析器,并专注于真正的问题,否则这将是过早的。
请注意,如果您只想读取数据一次(即满足于使用堆栈),则这可能会更快(避免枚举器的开销)。个人情况各异。
Stack<T> stack = null;
while (stack.Count > 0)
{
T value = stack.Pop();
// process value
}
你做过任何基准测试吗,还是只是凭直觉?
如果你认为大部分处理时间都花在循环遍历栈上,那么应该进行基准测试并确保情况确实如此。如果是这样,你有几个选择。
编辑:
可能不需要循环遍历的循环示例包括尝试在列表中查找或匹配两个列表等。如果循环花费了很长时间,请看看是否有意义将列表放入二叉树或哈希映射中。虽然创建它们可能会有一些初始成本,但如果重新设计代码,您可能会通过具有O(1)查找的后续操作获得回报。
Stack<MyClass> stacky = new Stack<MyClass>();
foreach (MyClass item in stacky)
{
// this is as fast as you're going to get.
}
是的,使用通用堆栈将节省强制转换的步骤。
IEnumerable<T>
或 IEnumerator<T>
不会创建转换,如果迭代变量是类型 T,则在大多数情况下使用泛型会更快,但泛型存在一些非常微妙的问题,特别是在与值类型一起使用时。var enumerator = stack.GetEnumerator();
while(enumerator.MoveNext ()) {
// do stuff with enumerator value using enumerator.Current
enumerator.Current = blah
}