问题描述
所以,为了让我的代码更快,我希望将我的 if 语句转换为三元组,因为这是一个完美的地方。这是因为三元语句比 if 语句更快,因为它是无分支的。由于这条线的运行频率,我想对其进行优化。 原函数:
void Union(Node nodes[],Node &n,Node &u)
{
Node& nRoot = findRoot(nodes,n.val);
Node& uRoot = findRoot(nodes,u.val);
int nRootRank = nodes[nRoot.val.second].rank;
int uRootRank = nodes[uRoot.val.second].rank;
if (nRootRank < uRootRank) nodes[nRoot.val.second].parent = &uRoot;
else if (nRootRank > uRootRank) nodes[uRoot.val.second].parent = &nRoot;
else if (std::rand() % 2)
{
nodes[nRoot.val.second].parent = &uRoot;
uRoot.rank++;
}
else
{
nodes[uRoot.val.second].parent = &nRoot;
nRoot.rank++;
}
}
和无分支版本:
void Union(Node nodes[],u.val);
int nRootRank = nodes[nRoot.val.second].rank;
int uRootRank = nodes[uRoot.val.second].rank;
(nRootRank < uRootRank) ? nodes[nRoot.val.second].parent = &uRoot :
(
(nRootRank > uRootRank) ? nodes[uRoot.val.second].parent = &nRoot :
(
(std::rand() % 2) ? (nodes[nRoot.val.second].parent = &uRoot,uRoot.rank++) :
(
(nodes[uRoot.val.second].parent = &nRoot,nRoot.rank++)
)
)
);
}
我遇到的问题是 '(nRootRank > uRootRank) 中的冒号? node[uRoot.val.second].parent = &nRoot : ' 表示“操作数类型不兼容(“Node *”和“int”)C/C++(42)”尽管从我所见,三元不应该有任何问题。任何想法为什么它会给出该消息?不,对于那些直接进入“如果比三元更好”的人来说,不是,除非在少数情况下将优化版本硬编码到 C++ 中。如果您想了解原因,请查看无银行编程。
解决方法
每个人都非常正确地指出三元语句是分支语句。然而,与此同时,为了回答你的实际问题,你的第一个三元赋值给了 .parent
,最后一个三元返回了 .rank++
的结果,也就是说,实际上,赋值了一个 int
到 Node *
。
我有点想知道固定版本是否更快,但我敢打赌它不是。唯一的原因可能是优化器失败,但我见过更奇怪的......
,由@1201ProgramAlarm 解决 ” 如果您小心,您可以设置不同的值类型。反转逗号运算符中的操作。首先递增,然后最后对 parent 进行赋值,以便逗号运算符为所有表达式返回相同的类型。 "