【问题标题】:Array_walk through 10000 items. Optimization possible?Array_walk 遍历 10000 个项目。可以优化吗?
【发布时间】:2012-10-05 17:07:41
【问题描述】:

我的代码使用 array_walk 遍历一个数组,该数组包含大约 10.000 个项目。查询需要 5.19 秒来获取记录,但遍历数组需要 19.86 秒。可能没有什么我可以做的来加快速度?

问题以 json 格式返回,并由 jquery dataTables 插件用于创建表。该插件似乎对这么多条目没有问题(至少在 Firefox 上没有)。

我正在使用 laravel 框架。请参阅下面的控制器代码

$start = microtime(true);
$questions = Question::with(array('tags', 'category'))->get();
$now = microtime(true) - $start;
echo "<h3>FETCHED QUESTIONS: $now</h3>";
array_walk($questions, function(&$value, $key) {
    $value = $value->to_array();
    if (empty($value['category'])) $value['category'] = '--';
    if (empty($value['difficulty'])) $value['difficulty'] = '--';
    $value['difficulty'] = HTML::difficulty_label($value['difficulty']);
    $value['approved'] = HTML::on_off_images($value['approved'], 'approved', 'declined');
    $value['active'] = HTML::on_off_images($value['active'], 'active', 'disabled');
    $value['edit_link'] = '<a href="' . URL::to('admin/editquestion/' . $value['id']) . '">' . HTML::image('img/icons/pencil.png', 'edit question') ; '</a>';
});

$spent = microtime(true) - $start - $now;
$now = microtime(true) - $start;
echo "<h3>AFTER WALK: $now ($spent)</h3>";
$out = array('aaData' => $questions);
return json_encode($out);

【问题讨论】:

  • 可能是实现某种形式的分页恕我直言的更好选择。
  • 当您使用数据表时,请将其固有的分页与服务器端处理一起使用。这是一种比一次性转储所有表数据更有效的方法。
  • 感谢您的建议。我一定在示例页面上错过了它。我将使用服务器端处理。

标签: php arrays query-optimization laravel


【解决方案1】:

只需使用 foreach 自己循环数组即可避免进行 10000 次函数调用的惩罚:

foreach($questions as &$value) {
    $value = $value->to_array();
    if (empty($value['category'])) $value['category'] = '--';
    if (empty($value['difficulty'])) $value['difficulty'] = '--';
    $value['difficulty'] = HTML::difficulty_label($value['difficulty']);
    $value['approved'] = HTML::on_off_images($value['approved'], 'approved', 'declined');
    $value['active'] = HTML::on_off_images($value['active'], 'active', 'disabled');
    $value['edit_link'] = '<a href="' . URL::to('admin/editquestion/' . $value['id']) . '">' . HTML::image('img/icons/pencil.png', 'edit question') ; '</a>';
}

【讨论】:

  • 感谢您的建议,我更新了我的代码。不过好像没有太大的改善。而且时间有点波动(在我的本地机器上,最大/尝试大约 2 秒)。我想如果不使用分页,我将无法提高这么多(比如最多 10 秒)..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多