test"; # Хост,
который Вы настроили ранее на GUI профайлера
echo "\n";
В этом скрипте мы сравним отличие в эффективности работы встроенной функции array_intersect и ее самописного клона user_array_intersect. После описания функций мы подключили профайлер для генерации и сохранения отчета. Посмотрим на отчет:
Из отчета видно, что эффективность собственной реализации функции array_intersect в два раза меньше встроенной (еще одно напоминание об использовании стандартных средств прежде всего!). Небольшая справка по терминологии отчетов:
* Incl[usive] Time - время, потраченное на функцию и на все функции, вызванные из нее
* Excl[usive] Time - время, потраченное на функцию без учета времени на вложенные функции
На скриншоте показана только часть отчета, кроме этих показателей отчет также содержит статистику по процессорным затратам и использованной памяти.
Графические отчеты
XHprof позволяет строить графические отчеты. Для построения он использует внешний инструмент Graphviz, поэтому убедитесь, что он установлен. Графический отчет вышеуказанного скрипта выглядит так:
Графический отчет позволяет визуально оценить ресурсоемкость каждой функции (красный должен привлечь внимание!). Как видим, в примере самой затратной функцией для ресурсов стала in_array(), которая сама по себе не является проблемой но говорит о плохом техническом решении.
Профилирование production проектов
XHprof позволяет профилировать не только отдельные участки кода но и production проекты. Т.к. профилирование проектов в среде production процесс ресурсоемкий, то главный тут критерий - производительность. И XHprof тут прекрасно справляется, т.к. создан он был именно для таких целей. Во-первых XHprof написан на C, во-вторых имеет ряд настроек:
* Таймер CPU на Linux системах имеет большой оверхед, поэтому разработчики рекомендуют использовать профайлер в режиме “elapsed time + memory”:
// elapsed time profiling (default) + memory profiling
xhprof_enable(XHPROF_FLAG>S_MEMORY);
* Сбор данных профайлера будет весьма точно отражать реальную картину, если его запускать не каждый раз, а случайно и равнораспределенно, например для запуска каждый сотый раз:
if (mt_rand(1, 100) == 1) {
xhprof_enable(XHPROF_FLAG>S_MEMORY);
$xhprof_on = true;
}
...
if ($xhprof_on) {
$xhprof_data = xhprof_disable();
}
* Режим Lightweight Sampling - в этом режиме профилирование выполняется в течении короткого промежутка во времени (сэмплами) - 0.1 секунды
Пример профилирования production проекта
В качестве примера используем проект на Yii - Hello World!
Наш проект http://project/.
GUI нашего профайлера (содержимое папки xhprof_html) http://xhprof/.
xhprof_lib находится в “/usr/local/share/php/xhp>rof_lib”.
Создаем 2 файла (header.php и footer.php).
header.php
<?php
if (extension_loaded('xhprof>')) {
/ Способ 1 - файлы лежат в проекте
// include_once '/usr/local/share/php/xhp>rof_libutils/xhprof_lib.>php';
/ include_once '/usr/local/share/php/xhp>rof_libutils/xhprof_runs>.php';
/ Способ 2 - файлы лежат в /usr/local/share/php/xhpr>of_lib
include_once dirname(__FILE__) . 'xhprof_lib/utils/xhprof>_lib.php';
include_once dirname(__FILE__) . 'xhprof_lib/utils/xhprof>_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
footer.php
<?php
if (extension_loaded('xhprof>')) {
$profiler_namespace = 'myapp'; / namespace for your application
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($x>hprof_data, $profiler_namespace);
/ url to the XHProf UI libraries (change the host name and path)
$profiler_url = sprintf('http://' . $_SERVER['SERVER_NAME'] .
'/xhprof/index.php?run=%s>&source=%s', $run_id, $profiler_namespace);
/ Можем сделать защиту по айпи, или добавить $_GET параметр
if (in_array($_SERVER['REMOT>E_ADDR'], array('127.0.0.1', '::1')))
... / На нашей странице появится ссылка "Profiler output", которая ведет на GUI
XHprof с уникальными идентификатором отчета
echo '<br/><br/><a href="'. $profiler_url .'" target="_blank">Profiler
output</a>';
}
}
Для внедрения профайлера в наш проект есть 2 способа:
1) Создаем файл .htaccess
php_value auto_prepend_file ../xhprof/header.php
php_value auto_append_file ../xhprof/footer.php
2) Добавляем вызов в файла в наш index.php
<?php
include('xhprof/header.ph>p');
/ include Yii bootstrap file
require_once(dirname(__FI>LE__).'framework/yii.php>');
/ create a Web application instance and run
Yii::createWebApplication>()->run();
include('xhproffooter.ph>p');
Загружаем страницу сайта. Внизу страницы появляется ссылка “Profiler output”, которая ведет на GUI XHprof с уникальными идентификатором отчета. Каждый раз, когда мы обновляем страницу отчет перегенирируется и идентификатор изменится.
Получаем отчет:
Показатели:
* Total Incl. Wall Time (microsec): 18,710 microsecs (время затраченное на выполнение функций с учетом ожидания ответов от сокетов, файловой системы и других ресурсов )
* Total Incl. CPU (microsecs): 16,309 microsecs (время затраченное на выполнение функций)
* Total Incl. MemUse (bytes): 527,604 bytes (использование памяти)
* Total Incl. PeakMemUse (bytes): 529,428 bytes (пиковое использование памяти)
* Number of Function Calls: 179 (количество вызовов функций)
Что почитать:
* XHProf Documentation
* Pecl: xhprof
* Profiling with XHProf
* XHprof - профилирование PHP от Facebook
* Профилирование PHP-кода
А так же :
От морщин и расширенных пор сухой кожи
Внедрение
средств автоматизации
В преддверии XXI века в развитии человеческой цивилизации происходят глобальные изменения, ведущие к её новому этапу - постиндустриальному обществу, все шире использующему компью-теризированные орудия труда и информационные технологии. Информация в таком обществе становится одним из основных продуктов деятельности человека, и библиотекам со своим огромным информационным потенциалом предстоит войти в процесс развития информационной индустрии, обогащая содержание и расширяя ассортимент производимого ими информационного продукта, включая в поле деятельности наряду с библиографической информацией фактографическую и аналитическую, а также создание традиционной и новой продукции (фонды, каталоги в бумажном и машиночитаемом видах, банки данных).
On Russian mentality
Ссылки на сайты для девочек!!!
Альфьери Витторио, граф д’Асти
А. О. Дёмин. Альфьери, Альфиери (Alfieri) Витторио, граф д’Асти (1749–1803) Альфьери, Альфиери (Alfieri) Витторио, граф д’Асти (1749–1803), итальянский поэт, драматург-трагик, политический писатель. Новаторство трагедий А., построенных в соответствии с принципами французского классицизма, заключалось в предельной концентрации драматического действия, устранении второстепенных персонажей и эпизодов, что приводило к неизвестной ранее итальянскому театру краткости текста пьесы.
РЕГИСТРАЦИЯ ПРОДАЖ И ПРОГНОЗИРОВАНИЕ
1. Ведение записей, связанных с продажей товаров В этой работе речь пойдет о ведении записей, связанных с продажей товаров. Это необходимо как для организации интенсивного сбыта, так и для контроля за эффективностью мероприятий в сфере маркетинга. С помощью этих записей Вы сможете контролировать свою деятельность по сбыту не только в данный момент, но и в будущем.