我在CakePHP 2.3.4和PHP 5.5上使用MySQL在我的Ubuntu服务器上运行。我有这样的循环:
foreach($notification_group['User'] as $notification_user) {
// Do something
$this->set($notification);
$this->Notification->create();
$this->Notification->save($notification); // 0.4 seconds per iteration
}
// Do same something
$this->set($notification);
$this->Notification->create();
$this->Notification->save($notification); // Less than 0.1 seconds
在循环中,每次迭代需要0.4秒才能完成。但是循环外的创建和保存方法只需(不到0.1秒)即可完成。循环开销应该不是问题。
为什么在循环中执行基本插入需要这么长时间?怎么改进呢?谢谢!
更新1:我已经尝试在循环中注释掉create和save方法,结果发现循环根本没有太多的开销。 我想知道为什么在尝试saveMany()或其他方法之前发生这种性能影响。
更新2:我尝试过saveMany()一次保存一组通知。以下是代码段:
$notification_array = array();
// Save notificaions
foreach($notification_group['User'] as $notification_user) {
$notification = null;
// Do something
$this->set($notification);
array_push($notification_array, $notification);
// $this->Notification->create();
// $this->Notification->save($notification);
}
if (!empty($notification_array)) {
$this->Notification->saveMany($notification_array);
}
性能与在循环中使用create和save相同 - 每次迭代/记录保存0.4秒。如果我注释掉saveMany(),性能命中就会消失。
更新3:我不在NotificationController。我在函数的开头加载了通知模型:
$this->loadModel('Notification');
循环是第一个使用通知模型的人。延迟加载机制是否会影响性能?如何避免呢?