gpt4 book ai didi

c++ - lambda 的速度与内联函数

转载 作者:行者123 更新时间:2023-11-28 07:16:21 24 4
gpt4 key购买 nike

我在使用 lambda 函数时遇到速度问题。这是代码:

Lit Simplifier::lit_diff_watches(const OccurClause& a, const OccurClause& b)
{
set_seen_for_lits(b, 1);

size_t num = 0;
Lit toret = lit_Undef;
const auto check_seen = [&] (const Lit lit) {
if (seen[lit.toInt()] == 0) {
toret = lit;
num++;
}
};
for_each_lit(a, check_seen);
/*switch(a.ws.getType()) {
case CMSat::watch_binary_t:
check_seen(a.lit);
check_seen(a.ws.lit2());
break;

case CMSat::watch_tertiary_t:
check_seen(a.lit);
check_seen(a.ws.lit2());
check_seen(a.ws.lit3());
break;

case CMSat::watch_clause_t: {
const Clause& clause = *solver->clAllocator->getPointer(a.ws.getOffset());
for(const Lit lit: clause) {
check_seen(lit);
}
break;
}
}*/
set_seen_for_lits(b, 0);

if (num == 1)
return toret;
else
return lit_Undef;
}

for_each_lit 函数的签名是:

void for_each_lit(
const OccurClause& cl
, std::function<void (const Lit lit)> func
);

函数lit_diff_watches 运行数百万次,在一个例子上耗时3.3s。但是,当我取消注释开关并注释掉 for_each_line(这是开关的复制粘贴)时,我得到 1.7s 的相同精确运行。请注意,在 99% 的情况下,watch_binary_twatch_tertiary_t 都会发生,即每次 lit_diff_watches 函数调用只应执行很少的指令。

你能告诉我我做错了什么吗? GCC 4.7 和当前的 llvm-svn(2013 年 11 月 25 日)的行为相同,时间差异很小。我猜函数调用不是内联的,但我不是专家。我想修复这个问题,因为这个 switch(..){..} 在代码中的很多地方,以及 lambdas 和 for_each_lit 的使用会显着清理代码。但是,我不能为此放慢速度。 10-20% 会很好,但几乎 2 倍的减速就太多了。

最佳答案

cbreak-work 在 #c++ freenode IRC channel 上帮助了我。他建议“Kerrek SB”在评论中上面写的内容。我将 for_each_lit 的声明更改为:

template<class Function>
void for_each_lit(
const OccurClause& cl
, Function func
);

现在两种实现的速度相同。显然,编译器无法进行链接时优化以避开虚函数调用,因此开销很大。

感谢大家的帮助!

关于c++ - lambda 的速度与内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com