我在代码中多次使用函数uasort。我用它来按照各种标准对100个左右的用户进行排序。用户存储在多维数组中。一组典型的用户看起来有点像这样:
$users => array(
'username' => // The username key is always lowercase for case-insensitivity.
array (
'nick' => 'Username', // Case-ified username, for display purposes.
'lines' => 8631, // Number of lines spoken.
'words' => 27343, // Number of words said.
'chars' => 132596, // Number of characters said.
'sad' => 24,
'yell' => 132, // Various mildly-interesting stats.
'happy' => 4
)
);
根据行数进行排序没有任何障碍:
function top_sort($a, $b) // Sort according to number of lines, in descending order.
{
return $b['lines'] - $a['lines'];
}
// Elsewhere...
uasort($users, "top_sort");
此代码的执行在几分之一秒内完成。
然而,这个稍微不同的代码根据有趣的值进行排序需要一秒钟(给出或需要200毫秒)来完成每个uasort:
function interesting_sort($a, $b) // Sort according to number of lines, in descending order.
{
global $stattype;
return ($b[$stattype]/$b['lines']) - ($a[$stattype]/$a['lines']);
}
// Elsewhere...
uasort($users, "interesting_sort");
全局变量stattype在foreach循环中设置,循环遍历所有有趣的统计数据。删除循环和全局变量,然后硬编码每个uasort没有任何效果。在此之后删除除了一个有趣的统计数据之外的所有统什么可能导致如此巨大的性能损失?我能看到的唯一区别是第二个片段访问和额外的数组值并将两者分开。这个问题的根源是如此微不足道的?