【问题标题】:Best way for fast processing快速处理的最佳方式
【发布时间】:2009-12-04 00:14:15
【问题描述】:

作为一名 PHP 程序员,我经常遇到(深入的)语句,我很好奇您是如何处理这个问题的。您使用的是 switch、if-elseif-else 还是 if-else 结构?

我个人更喜欢在处理超过 2 种情况时使用开关选择器。从性能的角度来看,这也是最好的方式吗?那么嵌套语句呢?

我很好奇你喜欢的方法和答案。

例子

三选项选择器的需要:

使用开关:

switch($option)
{
  case 1 : $result= "foo"; break;
  case 2 : $result= "bar"; break;
  default : $result= "foobar";
}

使用 if-elseif-else

if($option == 1)
{
  $result= "foo";
} elseif ($option == 2)
{
  $result= "bar";
} else
{
  $result= "foobar";
}

使用 if-if-else

if($option == 1)
{ 
  $handle = "foo";
}
if($option == 2)
{
  $result = "bar";
}
else
{
  $result = "foobar";
}

【问题讨论】:

  • 你能举个例子吗?
  • 需要更多信息,因为问题太宽泛了,有时解决方案是修复程序设计以消除对如此多的嵌套 if 语句的需求。

标签: php performance css-selectors


【解决方案1】:

除了新手程序员之外的每个人都知道switchif..else 快,但是switch 不能替换您可能放在if 语句中的每个复合表达式(例如两个表达式逻辑与)

另外,如果你在谈论像这样的深层嵌套代码

function foo()
{
  if ( /* expr1 */ )
  {
    // code

    if ( /* expr2 */ )
    {
      // code 

      if (  /* expr3 */ )
      {
        // code
        if ( /* expr4 */ )
        {
          // code          
        }
      }
    }
  } 
}

那么我只能说,请停止这样做。有一些保护条件会强制函数提前退出。这是用这种风格重写的上面的内容。

function foo()
{
  if ( !/* exp r1 */ )
  {
    return;
  }
  // code 1

  if ( !/* expr 2 */ )
  {
    return;
  }
  // code 2

  if ( !/* expr 3 */ )
  {
    return;
  }
  // code 3

  if ( !/* expr 4 */ )
  {
    return;
  }
  // code 4
}

当然,在真正的应用程序中,这两者都可以通过添加更多功能进行更好的重构。

【讨论】:

  • 我从未放弃采用您第二个示例中的方法,但这对我来说很有意义。此外,代码变得更具可读性,尤其是当您嵌套 10 次左右时。顺便说一句,我不知道性能方面的事情;)
【解决方案2】:

当您在许多情况下共享一个逻辑时,我发现 switch 很方便。 即。

case 1:
case 2:
case 3:
    // do stuff for 1, 2 and 3
    break;
case 4:
    // other stuff just for 4
    break;
default:
    // fallback for everything else
    break;

同样重要的是要注意 switch 确实 loose comparison 这在某些情况下可能是不受欢迎的

从性能的角度来说不用多说

【讨论】:

  • switch 通常比常规 if 快
  • 是在所有编程中还是仅在 php 中?您能否详细说明为什么开关更快?
  • 我同意你的观点,它看起来更整洁,如果找到某个标准,你可以轻松获取一个组。
【解决方案3】:

我通常更喜欢使用最简洁、最容易理解的方法。但是,我尽量避免需要问这个问题。必须在代码中使用大量 if/else 块表明您的设计存在问题。
鉴于创建关联数组很容易,没有理由不能将键映射到函数或值,这对于除琐碎数据集之外的任何内容都可能优于 switch 语句。或者甚至更好地使用polymorphism,这是一个更简洁的解决方案,并且经常将大的 if 或 switch 块转换为单个函数调用。

【讨论】:

  • 通过将函数映射到数组中,这也是一个很好的观点。如果我错了,请纠正我,但数组不是总是以相同的速度读取,与索引的位置无关?
  • 根据实现的不同,它可能更接近于 O(n log n) 甚至 O(log n) 而不是 O(n) 的线性搜索
  • 显然你学的数学比我多.. :/ 我不喜欢日志.. ;)
【解决方案4】:

如果你看三个例子,我会说,最漂亮和最干净的一个很容易选择:switch 语句。如果您可以接受 switch 的松散比较,请选择它。在这个层面上,性能方面的考虑通常是毫无意义的,因为潜在的收益是微乎其微的。

【讨论】:

  • 我知道好处很少,但如果你知道什么最适合处理,为什么不标准使用它?优化是一点点进行的,而不是大块的;)所有的和平都必须共同努力才能使其“顺利”。
  • 我明白你的意思,但我不同意你的观点:你可以节省几毫秒,但你的代码将变得更难阅读和维护。几乎在每个应用程序中,通常都存在瓶颈,优化后可以节省数十倍或数百倍的处理时间。
【解决方案5】:

如果您需要此类微优化,则应使用另一种语言。 作为一个懒惰的程序员,我喜欢做这种事情:

class blabla{
  private $_actions;
  public function __construct(){
    $this->_actions = array(1 => '_firstAction',
                            2 => '_secondAction',
                            3 => '_thirdAction');

  }
  public function whatever($choice){
    if(isset($this->_actions[$choice])){
      $this->{$this->_actions[$choice]}();
    }
  }
  private function _firstAction(){}
  private function _secondAction(){}
  private function _thirdAction(){}
}

【讨论】:

  • 但是这不是有点歪曲了您的代码,使其阅读不友好吗?
  • 对于 2 或 3 个不同的选择,它可能看起来不太可读。但是如果你有 10 个,我更喜欢我整洁的数组,而不是一个大开关或 if/else 块。
猜你喜欢
  • 2011-07-30
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多