我正在开发一个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的平均值吗?
答案 0 :(得分:1)
您可以使用each(),pop()和shift()从php数组中检索值。 switch或chained if语句的替代方法是使用关联的回调数组。通过使用带有排序数组的each(),您可以选择在不使用循环结构的情况下遍历数组。
但是关于哪个是最快的问题......控制结构的开销可能相对于你对数据所做的“某事”而言非常小。但即使是这种情况,找出哪个最快的唯一方法就是尝试并测量它。
但是考虑到你向我们展示的代码结构,达到快速响应的一个可能途径是在多个线程之间对处理进行分片。但这确实需要很多考虑 - there are cases where spawning multiple tasks via http requests会产生很好的结果 - 但是http和TCP开销很重要,因此通常只会看到“某事”不是本地资源密集但是耗时的好处。更有效的解决方案是运行分支守护程序或守护程序进程池(池管理可能很复杂)或基于线程的守护程序,使用共享内存或Unix(文件系统)套接字与前端脚本进行通信。