我有一个三角形类,其中包含指向节点(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个简单比较。
我可以消除所有else语句,因为每个真实的代码块都包含一个返回。然而,我真的觉得编译器应该足够聪明,能够自己处理任何收益。
a
和/或b
可能根本不在节点中的情况。这是必须支持的真实可能性吗?还是a
和b
保证始终在节点中?如果你能提供这种保证,那么你就可以减少一半的比较次数。 - Remy Lebeau