【问题标题】:Fastest way to find other node找到其他节点的最快方法
【发布时间】: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 可能根本不在节点中的可能性。这是必须支持的真正可能性吗?或者ab 是否总是保证在节点中?如果你能提供这样的保证,那么你就可以淘汰一半的比较。
  • @remy 通过在分析之前询问,我希望找到理解和洞察力,而不仅仅是经验证据。我相信我们可以保证这段代码永远不会返回 NULL。
  • @Fureeish 抱歉发错地方了。

标签: c++ c performance


【解决方案1】:

任何与自身异或的东西都将是零,所以如果你得到三个中的两个,你可以通过 n0 ^ n1 ^ n2 ^ a ^ b 找到剩下的一个。这很值得解释性评论,但如果速度很重要,那几乎可以肯定是您最快的选择。

【讨论】:

  • 通过适当的演员表,它似乎工作return (Node *) ((uintptr_t) n0 ^ (uintptr_t) n1 ^ (uintptr_t) n2 ^ (uintptr_t) a ^ (uintptr_t) b);。它似乎很难被击败。
  • 假设ab 都是指向被检查三角形内部节点的指针。如果它们是指向外部节点的指针,则此方法失败。
  • 虽然这是这个问题的最佳答案,但它仍然没有回答稍微更笼统的问题——复合条件句是否比简单条件句花费更多的时间?是否值得像这样手动扩展代码以得到不重复检查的简单条件?
猜你喜欢
  • 2020-09-24
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多