<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Разработка &#187; профилирование</title>
	<atom:link href="http://www.job-blog.bullgare.ru/tag/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.job-blog.bullgare.ru</link>
	<description>о программировании и работе</description>
	<lastBuildDate>Wed, 08 Feb 2012 09:39:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Как узнать самые ненужные индексы в mysql</title>
		<link>http://www.job-blog.bullgare.ru/2009/10/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b7%d0%bd%d0%b0%d1%82%d1%8c-%d1%81%d0%b0%d0%bc%d1%8b%d0%b5-%d0%bd%d0%b5%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d1%8b-%d0%b2-mysql/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/10/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b7%d0%bd%d0%b0%d1%82%d1%8c-%d1%81%d0%b0%d0%bc%d1%8b%d0%b5-%d0%bd%d0%b5%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d1%8b-%d0%b2-mysql/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 19:18:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=400</guid>
		<description><![CDATA[SELECT t.TABLE_SCHEMA AS `db`, t.TABLE_NAME AS `table`, s.INDEX_NAME AS `index name` , s.COLUMN_NAME AS `field name`, s.SEQ_IN_INDEX `seq in index`, s2.max_columns AS `# cols` , s.CARDINALITY AS `card`, t.TABLE_ROWS AS `est rows` , ROUND(((s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) * 100), 2) AS `sel %` FROM INFORMATION_SCHEMA.STATISTICS s INNER JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND [...]]]></description>
			<content:encoded><![CDATA[<pre class="code">
SELECT
  t.TABLE_SCHEMA AS `db`, t.TABLE_NAME AS `table`, s.INDEX_NAME AS `index name`
 , s.COLUMN_NAME AS `field name`, s.SEQ_IN_INDEX `seq in index`, s2.max_columns AS `# cols`
 , s.CARDINALITY AS `card`, t.TABLE_ROWS AS `est rows`
 , ROUND(((s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) * 100), 2) AS `sel %`
FROM INFORMATION_SCHEMA.STATISTICS s
 INNER JOIN INFORMATION_SCHEMA.TABLES t
  ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME
 INNER JOIN (
  SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, MAX(SEQ_IN_INDEX) AS max_columns
  FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA != 'mysql'
  GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME
 ) AS s2
 ON s.TABLE_SCHEMA = s2.TABLE_SCHEMA AND
    s.TABLE_NAME = s2.TABLE_NAME AND
    s.INDEX_NAME = s2.INDEX_NAME
WHERE t.TABLE_SCHEMA != 'mysql'       /* Filter out the mysql system DB */
AND t.TABLE_ROWS > 10                 /* Only tables with some rows */
AND s.CARDINALITY IS NOT NULL         /* Need at least one non-NULL value in the field */
AND (s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) &lt; 1.00 /* unique indexes are perfect anyway */
ORDER BY `sel %`, s.TABLE_SCHEMA, s.TABLE_NAME          /* DESC for best non-unique indexes */
LIMIT 10;
</pre>
<p>Это из лекции товарища Jay Pipes</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/10/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b7%d0%bd%d0%b0%d1%82%d1%8c-%d1%81%d0%b0%d0%bc%d1%8b%d0%b5-%d0%bd%d0%b5%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d1%8b-%d0%b2-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Profiler: простой и удобный инструмент профилирования запросов</title>
		<link>http://www.job-blog.bullgare.ru/2009/09/mysql-profiler-%d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b9-%d0%b8-%d1%83%d0%b4%d0%be%d0%b1%d0%bd%d1%8b%d0%b9-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82-%d0%bf%d1%80%d0%be%d1%84%d0%b8/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/09/mysql-profiler-%d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b9-%d0%b8-%d1%83%d0%b4%d0%be%d0%b1%d0%bd%d1%8b%d0%b9-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82-%d0%bf%d1%80%d0%be%d1%84%d0%b8/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 09:42:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[администрирование]]></category>
		<category><![CDATA[серверная оптимизация]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[база данных]]></category>
		<category><![CDATA[бд]]></category>
		<category><![CDATA[оптимизация]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=339</guid>
		<description><![CDATA[оригинал; полная цитата: Сегодня был неожиданно удивлен, какие удобные штуки таит в себе MySQL. Хочу представить вашему вниманию фичу MySQL — профайлинг. Появилась она начиная с версии 5.0.37. Всего парой запросов можно узнать, какими запросами формируется страница (для веб-девелоперов) и почему она тормозит. И раньше подобный функционал был доступен, но пользоваться журналом запросов не в [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://habrahabr.ru/blogs/mysql/70435/">оригинал</a>; полная цитата:<br />
Сегодня был неожиданно удивлен, какие удобные штуки таит в себе MySQL.</p>
<p>Хочу представить вашему вниманию фичу MySQL — профайлинг.<br />
Появилась она начиная с версии 5.0.37.</p>
<p>Всего парой запросов можно узнать, какими запросами формируется страница (для веб-девелоперов)<br />
и почему она тормозит.</p>
<p>И раньше подобный функционал был доступен, но пользоваться журналом запросов не в пример сложнее.</p>
<p>Итак, как пользоваться:</p>
<p>mysql> set profiling=1;<br />
mysql> select count(*) from comment;<br />
mysql> select count(*) from message;<br />
mysql> show profiles;</p>
<p>+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| Query_ID | Duration   | Query                        |<br />
+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
|        1 | 0.00012700 | select count(*) from comment |<br />
|        2 | 0.00014200 | select count(*) from message |<br />
+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
2 rows in set (0.00 sec)</p>
<p>Вуаля! Все выполненные запросы за сессию с временем выполнения.</p>
<p>На мой взгляд очень просто и сверх-удобно.</p>
<p>Можно пойти дальше, и узнать подробно на что тратилось время по каждому запросу:</p>
<p>mysql> show profile for query 1;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+<br />
| Status                         | Duration |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+<br />
| starting                       | 0.000015 |<br />
| checking query cache for query | 0.000021 |<br />
| checking permissions           | 0.000003 |<br />
| Opening tables                 | 0.000007 |<br />
| System lock                    | 0.000004 |<br />
| Table lock                     | 0.000023 |<br />
| init                           | 0.000005 |<br />
| optimizing                     | 0.000005 |<br />
| executing                      | 0.000025 |<br />
| end                            | 0.000003 |<br />
| end                            | 0.000001 |<br />
| query end                      | 0.000002 |<br />
| storing result in query cache  | 0.000003 |<br />
| freeing items                  | 0.000003 |<br />
| closing tables                 | 0.000004 |<br />
| logging slow query             | 0.000002 |<br />
| cleaning up                    | 0.000001 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+<br />
17 rows in set (0.00 sec)</p>
<p>Подробнее о профайлинге в статье: <a href="http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html">Using the New MySQL Query Profiler</a></p>
<p>Upd: как точно подметил zayceslavshow profiles по умолчанию показывает профили для 15 запросов. Кол-во запрсов можно увеличить с помощью параметра profiling_history_size, но не более чем до 100.</p>
<p>mysql> set profiling=1;<br />
mysql> set profiling_history_size=100;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/09/mysql-profiler-%d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b9-%d0%b8-%d1%83%d0%b4%d0%be%d0%b1%d0%bd%d1%8b%d0%b9-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82-%d0%bf%d1%80%d0%be%d1%84%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Профилирование php-проекта: Xdebug</title>
		<link>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 11:47:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[серверная оптимизация]]></category>
		<category><![CDATA[bottle-neck]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[xdebug]]></category>
		<category><![CDATA[бутылочное горлышко]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=240</guid>
		<description><![CDATA[Установка Скачать После помещения библиотеки в папку с расширениями в php.ini надо написать zend_extension = \ext\php_xdebug.dll Далее ставим плагин для firefox &#8211; Xdebug Helper, настройка всего инструментария &#8211; в базе знаний Google Работа с Xdebug под Eclipse ещё про установку и настройку xdebug, Профилирование с Xdebug на habrahabr. Самое основное &#8211; параметр в php.ini xdebug.profiler_enable_trigger=On [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xdebug.org/docs/install">Установка</a><br />
<a href="http://www.xdebug.org/download.php">Скачать</a><br />
После помещения библиотеки в папку с расширениями в <em>php.ini</em> надо написать</p>
<pre class="code">
zend_extension = <путь-к-php>\ext\php_xdebug.dll
</pre>
<p>Далее ставим плагин для firefox &#8211; <a href="https://addons.mozilla.org/ru/firefox/addon/3960">Xdebug Helper</a>, настройка всего инструментария &#8211; <a href="http://code.google.com/p/syslogr-utils/wiki/XdebugHelper">в базе знаний Google</a><br />
<a href="http://www.phpeclipse.com/wiki/Howto/XDebugAndPHPEclipse">Работа с Xdebug под Eclipse</a><br />
ещё про установку и <a href="http://www.ibm.com/developerworks/ru/library/os-php-xdebug/index.html">настройку xdebug</a>,<br />
<a href="http://habrahabr.ru/blogs/php/31468/">Профилирование с Xdebug на habrahabr</a>.<br />
Самое основное &#8211; параметр в php.ini</p>
<pre class="code">
xdebug.profiler_enable_trigger=On
</pre>
<p>В итоге у меня получилось (php5.3)</p>
<pre class="code">
zend_extension = путь-к-php53\ext\php_xdebug.dll
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.idekey=default

;xdebug.dump_once = On
;xdebug.dump_globals = On
;xdebug.dump_undefined = On
;xdebug.dump.REQUEST = *
;xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

xdebug.profiler_enable=Off
xdebug.profiler_output_dir="c:\traces"
xdebug.profiler_enable_trigger=On
xdebug.profiler_output_name="cachegrind.out.%R-%t"
</pre>
<p>Теперь достаточно передать в GET-параметре <em>?XDEBUG_PROFILE</em> (вот как раз тут полезен XdebugHelper &#8211; там это можно включить для определённого сайта).<br />
<a href="http://tigor.com.ua/blog/2008/07/21/php-profiler-debugger-xdebug/">много ссылок на полезные статьи</a>.<br />
<a href="http://code.google.com/p/webgrind/">Инструмент для анализа логов Xdebug</a> от создателя.</p>
<p><a href="http://forums.netbeans.org/post-9585.html"><strong>Дебаг проекта</strong> через NetBeans совместно с XdebugHelper</a>:<br />
запустить отладчик в NetBeans и затем нажать кнопку &laquo;run&raquo; (это NetBeans заставит слушать Xdebug), а затем открыть сайт с активированным на нём XdebugHelper&#8217;ом.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Профилирование php-проекта: APD</title>
		<link>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 12:48:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[серверная оптимизация]]></category>
		<category><![CDATA[APD]]></category>
		<category><![CDATA[bottle-neck]]></category>
		<category><![CDATA[бутылочное горлышко]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=192</guid>
		<description><![CDATA[При разработке сайта под большую нагрузку нужно постоянно искать слабые места в коде. К примеру, при добавлении нового функционала на частопосещаемой странице появился кусок кода (функция, метод), который заметно замедляет работу проекта в целом. Нет пределов совершенству, и проект можно вылизывать до бесконечности, но на что стоит обратить внимание &#8211; подскажет профайлер кода. Лично я [...]]]></description>
			<content:encoded><![CDATA[<p>При разработке сайта под большую нагрузку нужно постоянно искать слабые места в коде. К примеру, при добавлении нового функционала на частопосещаемой странице появился кусок кода (функция, метод), который заметно замедляет работу проекта в целом. Нет пределов совершенству, и проект можно вылизывать до бесконечности, но на что стоит обратить внимание &#8211; подскажет профайлер кода. Лично я использую в работе <a href="http://pecl.php.net/package/apd">APD (Advanced PHP Debugger)</a>. Во-первых, он хранится в репозитории модулей PHP, во-вторых, мне понравилось им пользоваться, в-третьих, у автора есть достаточно подробное описание в <a href="http://www.ozon.ru/context/detail/id/2527057/">книге &laquo;Профессиональное программирование на PHP&raquo;</a>, в-четвёртых, простота использования. Из минусов &#8211; давно не обновлялся и, видимо, уже заброшен разработчиком.<br />
<strong>Установка</strong> производится с помощью инсталлятора PEAR</p>
<pre class="code">
#pear install apd
</pre>
<p>После чего в файл php.ini необходимо добавить установленное расширение и произвести настройку. (Приведу для примера параметры для Windows)</p>
<pre class="code">
zend_extension = <Путь к установленному php>\ext\php_apd.dll
apd.dumpdir = c:\apd_traces\ ; здесь будут храниться промежуточные файлы трассировок
apd.statement_trace = 1
</pre>
<p>Если вызвать phpinfo(), должен появиться раздел с параметрами APD.<br />
<strong>Использование</strong>.<br />
Активизируется трассировка путём включения в нужный php-файл вызова функции</p>
<pre class="code">
apd_set_pprof_trace('c:\TEMP\apd_traces');
</pre>
<p>Протоколируется следующие события:</p>
<ul>
<li>вход в функцию</li>
<li>выход из функции</li>
<li>использование инструкций <em>include</em> и <em>require</em></li>
</ul>
<p>.<br />
При этом ведутся 3 счётчика:</p>
<ul>
<li>Real Time &#8211; прошедшее реальное время</li>
<li>User Time &#8211; время, затраченное на пользовательский код</li>
<li>System Time &#8211; время, затраченное на системные вызовы</li>
</ul>
<p>.<br />
После того, как файлы созданы (т.е. скрипт отработал), можно, к примеру, закомментировать строку вызова</p>
<pre class="code">
apd_set_pprof_trace('c:\TEMP\apd_traces');
</pre>
<p>(она больше не нужна).<br />
При установке APD из репозитория в папке<br />
<em><Путь к php>\PEAR\Console\</em> появится файл <em>pprofp</em>.<br />
Далее можно создать файл, к примеру, <em>run.bat</em>:</p>
<pre class="code">
php.exe pprofp -r c:\TEMP\apd_traces\pprof.00288.53 > c:\TEMP\apd_out_rmT.txt
</pre>
<p>где <em>c:\TEMP\apd_traces\pprof.00288.53</em> &#8211; это промежуточный файл трассировок, созданный при выполнении скрипта, а <em>c:\TEMP\apd_out_rmT.txt</em> будет создан и будет содержать полезную информацию в удобной форме.<br />
Можно, конечно, создать и более &laquo;умный&raquo; батник, котороый бы принимал имя промежуточного файла параметром, но статья не об этом.<br />
В итоге в файле увидим время выполнения функций и количество вызовов, что в дальнейшем должно помочь писать более &laquo;быстрый&raquo; код.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

