在阵列icw开关上循环时优化性能

时间:2015-04-17 16:57:41

标签: php arrays performance

我正在开发一个API,它将采用大约100个参数作为可能的输入。 API呼叫的数量(希望)每秒会进入数千个呼叫,因此性能是关键。

参数通过HTTP GET和POST进入,所以我在$ _REQUEST中拥有所有内容。我的默认代码如下:

foreach ($_REQUEST as $key=>$value) {
switch ($key) {
    case 'par1':
         // do stuff
         break;
    case 'par2':
         // do stuff
         break;
    case 'par3':
         // etc

现在,如果我的$ _REQUEST数组包含10个参数,那么switch语句将全部运行10次。但这对我没有任何意义。

在旧的基本GOTO日中,可以使用数组中的NEXT键基本上转到处理该键的内容的例程。您只需要一个附加数组,其中包含要跳转到的行数。如果我按键按字母顺序对数组进行排序,那么我只需要检查每个参数的最大值一次!

所以我的问题 - 我可以在PHP中做类似的事情,以便我的代码变成:

ksort($$_REQUEST);
$keys = array_keys($_REQUEST);
$i = 0;

// now I would preferably like to JUMP to the code where $key is a certain parameter, but my best effort would become:
if ($key[$i] == $par1) {
     // do something with $_REQUEST[$key[$i]]
     $i++;
}
if ($key[$i] == $par2) {
     // again do something with $_REQUEST[$key[$i]]
     $i++;
}
// etc etc

但是在上面的例子中我想以某种方式避免不必要的参数检查。

更新:理想情况下,我想要这样的东西,这意味着通过指针或引用调用函数:

function par1 ($value) {
    // do something
}

function par2 ($value) {
    // do something else
}

foreach ($_REQUEST as $key=>$value)
   call_user_func($key, $value);

这会更快,并节省50个ifs / case的平均值吗?

1 个答案:

答案 0 :(得分:1)

您可以使用each(),pop()和shift()从php数组中检索值。 switch或chained if语句的替代方法是使用关联的回调数组。通过使用带有排序数组的each(),您可以选择在不使用循环结构的情况下遍历数组。

但是关于哪个是最快的问题......控制结构的开销可能相对于你对数据所做的“某事”而言非常小。但即使是这种情况,找出哪个最快的唯一方法就是尝试并测量它。

但是考虑到你向我们展示的代码结构,达到快速响应的一个可能途径是在多个线程之间对处理进行分片。但这确实需要很多考虑 - there are cases where spawning multiple tasks via http requests会产生很好的结果 - 但是http和TCP开销很重要,因此通常只会看到“某事”不是本地资源密集但是耗时的好处。更有效的解决方案是运行分支守护程序或守护程序进程池(池管理可能很复杂)或基于线程的守护程序,使用共享内存或Unix(文件系统)套接字与前端脚本进行通信。