【发布时间】:2017-09-29 22:58:58
【问题描述】:
我有一个三角形类,带有指向节点 (n0,n1,n2) 的指针。当传递两个节点指针(a,b)时,我还有一个返回“其他”节点的方法。目前的实现是这样的:
if ( n0 == a && n1 == b )
{
return n2;
}
else if ( n0 == b && n1 == a )
{
return n2;
}
else if ( n1 == a && n2 == b )
{
return n0;
}
else if ( n1 == b && n2 == a )
{
return n0;
}
else if ( n0 == a && n2 == b )
{
return n1;
}
else if ( n0 == b && n2 == a )
{
return n1;
}
else
{
assert( 0 );
}
return NULL;
哪个有效,但可能不是最好的。在进行分析时,我的程序实际上在这个例程中花费了可衡量的时间,因此值得花一些时间进行优化。但是,我对编译器会做的优化不是很熟悉,所以我不确定这是否是多余的。
节点没有特定的顺序,因此平均需要执行 3.5 次复合比较。
另一种方法是:
if ( n0 == a )
{
if ( n1 == b )
{
return n2;
}
else if ( n2 == b )
{
return n1;
}
return NULL;
}
else if ( n1 == a )
{
if ( n0 == b )
{
return n2;
}
else if ( n2 == b )
{
return n0;
}
return NULL;
}
else if ( n2 == a ) // Theoretically redundant. Kept for safety.
{
if ( n0 == b )
{
return n1;
}
else if ( n1 == b )
{
return n0;
}
return NULL;
}
return NULL;
简单比较的平均结果为 3.5。这会更快 - 还是编译器会使它们相同?
有没有更快的方法?
我知道我可以消除多余的 if。在第一种情况下,它将平均值减少到 3.33 个复合比较。在第二种情况下,它会将平均值拉低到 3.0 次简单比较。
我可以消除所有其他的,因为每个真正的代码块都包含一个返回。但是,我真的觉得编译器应该足够聪明,可以自己处理任何收益。
【问题讨论】:
-
"这会更快" - 分析并找出答案
-
您的代码似乎有效。对于想要优化的工作代码,有一个appropriate site
-
您的两个代码示例都考虑了
a和/或b可能根本不在节点中的可能性。这是必须支持的真正可能性吗?或者a和b是否总是保证在节点中?如果你能提供这样的保证,那么你就可以淘汰一半的比较。 -
@remy 通过在分析之前询问,我希望找到理解和洞察力,而不仅仅是经验证据。我相信我们可以保证这段代码永远不会返回 NULL。
-
@Fureeish 抱歉发错地方了。
标签: c++ c performance