我做了一些搜索,但找不到我真正想要的东西。
我有以下情景:
有两个不同类型的容器。例如,一个是vector<netIterator> A
,另一个是list<netIterator *> B
。
if (c)
for loop on A { doingSth using the current netIterator; }
else
for loop on B { doingSth using the current netIterator; }
现在,doSth需要大约90行。
如果我将其定义为内联函数,则无法正确内联,并且运行时损失很大。 (添加更多测试数据: 使用非内联函数(有大约12个参数),运行时间为300秒;使用重复的代码,运行时间约为15秒。 请注意,容器中有150万个元素。 )
无论如何有效地基于c循环A或B而不重复代码&#34; doingSth&#34;?
这是C ++,我们公司目前不允许使用Boost库。
感谢您的任何建议!
{在我发布问题后的第二天更新:
在我的同事的帮助下,我终于找到了运行时增加的真正原因。这不是因为函数没有内联,而是因为函数的两个向量参数是通过复制而不是通过引用传递的。在每个函数调用中,向量被复制,构造,生长和销毁,在150万次迭代中需要300秒。解决问题后,使用函数的运行时间可以忽略不计。
该功能由IDE使用&#34;提取方法&#34;提取。重构,我认为这是正确的,并没有仔细检查参数列表,但实际上这次它做得非常好。之前我确实使用过它,它做得很好,但这次很糟糕。
再次感谢所有回答和评论我的问题!这是我在这里的第一个问题,我得到答案的速度有多快(几分钟!)。我喜欢所有的答案,很高兴向你学习!
}
答案 0 :(得分:2)
当然有办法:
void f(bool c, vector<T>& a, list<T>& b) {
auto lambda = [&](T& t) {/* your magic here */}
if(c)
for(auto&& x : a)
lambda(x);
else
for(auto&& x : b)
lambda(x);
}
你也可以同样完成同样的功能。
但在你抱怨调用函数与内联,测量和比较的巨大运行时间惩罚之前! (内联的二进制大小相同,当然。)
答案 1 :(得分:0)
嗯。好吧,我想你可以做点像
template<typename Container, typename Deref>
void loop_over(Container &container, Deref deref) {
for(auto &&element_raw : container) {
auto &&element = deref(element_raw);
// doSth with element
}
}
...
if(c) {
loop_over(A, [](netIterator &i) { return i; });
} else {
loop_over(B, [](netIterator *i) { return *i; });
}
这应该给你两个代码专业。
但我很难相信,如果不能内联90行代码会对性能产生巨大影响。你能可靠地测量它吗?