在循环外部计算map.end()的优点

时间:2017-01-30 02:44:46

标签: c++ performance stl iterator

我最近遇到了以下代码。

std::map<int, int> m;

// insert into the map

std::map<int, int>::iterator endOfMap = m.end();
for(std::map<int, int>::iterator itr = m.begin(); itr != endOfMap; ++itr) {

}

预先计算endOfMap有什么优势吗?

for(std::map<int, int>::iterator itr = m.begin(); itr != m.end(); ++itr) 

注意:
我看到的代码是字符串到自定义对象的映射,包含数百万个元素。

3 个答案:

答案 0 :(得分:2)

  

预先计算endOfMap有什么优势吗?

唯一的优势,,我可以看到,将是在循环的每次迭代中调用std::map::end()的成本降低。差异很可能很小。您只能通过迭代其中包含大量元素的map来找到它。尽管调用std::map::end()的费用由标准保证为O(1),但调用数百万次可能会给功能/程序带来显着的成本。

答案 1 :(得分:2)

由于您不了解words = re.findall(r'[^\W_]+', phrase) 的实现,您可以假设在循环之前进行分配可以节省每次循环调用map的开销。

但是开销是多少?我们已经知道end()是隐式内联的,因为它是一个模板函数;如果代码足够简单,编译器很可能会删除函数调用开销。 C ++标准保证end()是O(1)函数,这意味着它可能不太复杂。如果end()只是返回对象的一个​​成员而没有其他计算,那么将它复制到局部变量可能绝对没有节省!

另一方面,这是优化的一个主要例子,不会花费你任何成本。如果你养成了为你写的每个end()循环做这个的习惯,它就不会受到伤害,并且在很长一段时间内它可能会有所帮助。我甚至看到在for循环的第一段中完成了赋值,而不是在它自己的一行上完成。

答案 2 :(得分:0)

It saves you a function call on each iterations, but considering that the map.end() is pretty light-weight method, you won't see a difference unless you are calling this function million times a second.