如何编写条件 for 循环(如果 true 循环通过 A,否则循环通过 B)



我做了一些搜索,但没有找到我真正想要的东西。

我有以下情况:有两个不同类型的容器。例如,一个是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 行代码会对性能产生巨大影响。你测量得可靠吗?

相关内容

  • 没有找到相关文章

最新更新