我做了一些搜索,但没有找到我真正想要的东西。
我有以下情况:有两个不同类型的容器。例如,一个是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; }
现在大约需要 90 行。
如果我将其定义为内联函数,则无法正确内联,并且运行时损失巨大。(添加更多测试数据:使用非内联函数(大约有 12 个参数(,运行时为 300 秒;使用重复的代码,运行时约为 15 秒。请注意,容器中有 150 万个元素。)
有没有办法在不复制代码"doingSth"的情况下有效地基于 c 循环 A 或 B?
这是C++,我们公司目前不允许使用Boost库。
感谢您的任何建议!
{在我发布问题后的一天更新:
在同事的帮助下,我终于找到了运行时间增加的真正原因。这不是因为函数没有内联,而是因为函数的两个向量参数是通过复制而不是引用传递的。在每次函数调用中,向量被复制、构造、增长和销毁,这需要 300 秒,完成 150 万次迭代。修复问题后,使用函数的运行时间可以忽略不计。
该函数由 IDE 使用"提取方法"重构提取,我认为它做得对,并且没有仔细检查参数列表,但实际上这次做得很糟糕。我以前确实用过它,而且做得很好,但这次它很糟糕。
再次感谢所有对我问题的回答和评论!这是我在这里的第一个问题,我得到答案的速度给我留下了深刻的印象(几分钟!我喜欢所有的答案,很高兴从你那里学到它们!
}
当然有办法:
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);
}
您可以同样出色地使用完整功能来执行相同的操作。
但是,在您抱怨调用函数与内联函数的巨大运行时损失之前,请先测量和比较!
(当然,用于内联的二进制大小也是如此。
嗯。好吧,我想你可以做一些类似的事情
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 行代码会对性能产生巨大影响。你测量得可靠吗?