c++ - 找到其他节点的最快方法

标签 c++ c performance

我有一个三角形类,带有指向节点 (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 简单比较。

我可以删除所有其他代码,因为每个真正的代码块都包含一个返回值。但是,我真的觉得编译器应该足够聪明,可以自行解决任何问题。

最佳答案

任何与自身异或的东西都将为零,因此如果给定三个中的两个,只需执行 n0 ^ n1 ^ n2 ^ a ^ b 即可找到剩余的一个。它非常值得解释性评论,但如果速度很重要,那几乎肯定是您最快的选择。

关于c++ - 找到其他节点的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46497912/

相关文章:

java - 重访按值调用与按引用调用

c++ - 使用 ZMQ 和 protobuf 时收到 0 大小的消息

c - cs50 的 Vigenere 密码程序错误

performance - 具有数百万位模数和指数的模幂运算的极快方法

c++ - 有效的无符号到有符号转换避免实现定义的行为

c++ - Opencv 静态链接给出错误

c - 将 INT32 数组转储到 .bin 文件中

c - "Aborted"程序使用 GNU MP "large numbers"库

java - JScrollPane 'laggy' 滚动,有很多组件

node.js - 并行访问多个nodejs Api