Барьеры памяти не позволяют ЦП переупорядочивать доступ к объекту Element
, который не использует блокировки, через доступ к структуре очереди (здесь реализованы с использованием индексов, но указатели одинаково жизнеспособны).
Используя вашу нумерацию, важно, чтобы (3) выполнялось между (2) и (4), и барьер памяти обеспечивает это.
Точный случай, о котором вы спрашиваете о (2) -vs- (3) в источнике, предотвращает умозрительную перезапись действительных данных при заполнении очереди (предлагаемый сайт перекрывается с действительными данными). Без барьера, даже если условие не выполнено, исходные данные будут восстановлены с точки зрения потока источника, промежуточные значения могут быть кратко видны потребителю.
В unixoid системах (и в php 7 + в Windows также), можно использовать getrusage, как:
// Script start
$rustart = getrusage();
// Code ...
// Script end
function rutime($ru, $rus, $index) {
return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
- ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}
$ru = getrusage();
echo "This process used " . rutime($ru, $rustart, "utime") .
" ms for its computations\n";
echo "It spent " . rutime($ru, $rustart, "stime") .
" ms in system calls\n";
Примечание, что Вы не должны вычислять различие при порождении php экземпляра для каждого теста.
Я думаю, что необходимо посмотреть на xdebug. Профильные опции дадут Вам преимущество к знанию многих связанных с процессом объектов.
Самый дешевый и самый грязный способ сделать это, просто делают microtime()
, заходит в места в Вашем коде, которого Вы хотите сравнить. Сделайте его правильно прежде и прямо после запросов базы данных, и просто удалить те продолжительности из остальной части Вашего времени выполнения сценария.
подсказка А: Ваше время выполнения PHP редко будет вещью, которая делает Ваш тайм-аут сценария. Если сценарий испытывает таймаут, это почти всегда будет вызовом к внешнему ресурсу.
документация микровремени PHP: http://us.php.net/microtime