<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF121%3A%D0%9F%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</id>
		<title>LXF121:Профилирование - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF121%3A%D0%9F%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"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF121:%D0%9F%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&amp;action=history"/>
		<updated>2026-05-13T06:47:53Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF121:%D0%9F%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&amp;diff=10568&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF121:%D0%9F%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&amp;diff=10568&amp;oldid=prev"/>
				<updated>2010-07-20T06:43:55Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Оценка быстродействия и профилирование==&lt;br /&gt;
&lt;br /&gt;
: Бывает, что код до ужаса тормозит. '''Джульетта Кемп''' покажет, зачем использовать черную магию тестирования производительности.&lt;br /&gt;
&lt;br /&gt;
Работаете&lt;br /&gt;
ли вы с оборудованием&lt;br /&gt;
или с программным&lt;br /&gt;
продуктом,&lt;br /&gt;
на каком-&lt;br /&gt;
то этапе&lt;br /&gt;
скорость&lt;br /&gt;
обязательно&lt;br /&gt;
станет проблемой.&lt;br /&gt;
Задача&lt;br /&gt;
это обширная,&lt;br /&gt;
и мы ограничимся&lt;br /&gt;
ситуацией,&lt;br /&gt;
когда медленно&lt;br /&gt;
работает&lt;br /&gt;
код, и рассмотрим,&lt;br /&gt;
как его ускорить.&lt;br /&gt;
Меры&lt;br /&gt;
могут&lt;br /&gt;
быть разными,&lt;br /&gt;
от переписывания&lt;br /&gt;
программы&lt;br /&gt;
до покупки&lt;br /&gt;
нового&lt;br /&gt;
компьютера,&lt;br /&gt;
но прежде&lt;br /&gt;
всего&lt;br /&gt;
необходимо&lt;br /&gt;
найти&lt;br /&gt;
основную&lt;br /&gt;
причину&lt;br /&gt;
и узкое&lt;br /&gt;
место.&lt;br /&gt;
Тут-то и пригодится&lt;br /&gt;
тестирование&lt;br /&gt;
производительности — и весьма&lt;br /&gt;
важно&lt;br /&gt;
сделать&lt;br /&gt;
его правильно,&lt;br /&gt;
прежде&lt;br /&gt;
чем переходить&lt;br /&gt;
к реформам.&lt;br /&gt;
При сравнении различных&lt;br /&gt;
участков&lt;br /&gt;
кода&lt;br /&gt;
этот процесс&lt;br /&gt;
также&lt;br /&gt;
иногда называют&lt;br /&gt;
профилированием.&lt;br /&gt;
&lt;br /&gt;
Тестирование&lt;br /&gt;
производительности&lt;br /&gt;
важно&lt;br /&gt;
рассматривать&lt;br /&gt;
как часть процесса&lt;br /&gt;
усовершенствования&lt;br /&gt;
кода.&lt;br /&gt;
Для начала&lt;br /&gt;
создайте&lt;br /&gt;
код и убедитесь,&lt;br /&gt;
что он правильно&lt;br /&gt;
работает&lt;br /&gt;
– а уж потом&lt;br /&gt;
оценивайте,&lt;br /&gt;
достаточно&lt;br /&gt;
ли он быстр. В конце&lt;br /&gt;
концов,&lt;br /&gt;
нет особого&lt;br /&gt;
смысла&lt;br /&gt;
ускорять&lt;br /&gt;
код, если&lt;br /&gt;
он и так справляется:&lt;br /&gt;
вашу&lt;br /&gt;
энергию&lt;br /&gt;
можно&lt;br /&gt;
употребить&lt;br /&gt;
на другие&lt;br /&gt;
дела.&lt;br /&gt;
&lt;br /&gt;
===Повторяющийся процесс===&lt;br /&gt;
&lt;br /&gt;
А вот если&lt;br /&gt;
ваш код тормозит,&lt;br /&gt;
пора&lt;br /&gt;
заняться&lt;br /&gt;
тестированием.&lt;br /&gt;
Затем&lt;br /&gt;
используйте&lt;br /&gt;
результаты&lt;br /&gt;
(вместе&lt;br /&gt;
с анализом&lt;br /&gt;
и профилированием)&lt;br /&gt;
для определения&lt;br /&gt;
наилучшей&lt;br /&gt;
точки&lt;br /&gt;
приложения&lt;br /&gt;
усилий.&lt;br /&gt;
Реализовав&lt;br /&gt;
исправления,&lt;br /&gt;
тестируйте&lt;br /&gt;
снова,&lt;br /&gt;
чтобы&lt;br /&gt;
увидеть,&lt;br /&gt;
достаточно&lt;br /&gt;
ли&lt;br /&gt;
принятых&lt;br /&gt;
мер. Если&lt;br /&gt;
нет, переходите&lt;br /&gt;
к следующей&lt;br /&gt;
области&lt;br /&gt;
и продолжайте&lt;br /&gt;
работу.&lt;br /&gt;
&lt;br /&gt;
Важно&lt;br /&gt;
убедиться,&lt;br /&gt;
что ваши&lt;br /&gt;
числа&lt;br /&gt;
состоятельны&lt;br /&gt;
(то есть&lt;br /&gt;
вы понимаете,&lt;br /&gt;
что получили)&lt;br /&gt;
и сосредоточить&lt;br /&gt;
усилия&lt;br /&gt;
на том участке,&lt;br /&gt;
где эффект&lt;br /&gt;
будет&lt;br /&gt;
максимален.&lt;br /&gt;
Явно&lt;br /&gt;
не стоит&lt;br /&gt;
двое суток&lt;br /&gt;
биться&lt;br /&gt;
над алгоритмом,&lt;br /&gt;
если&lt;br /&gt;
задержка&lt;br /&gt;
обусловлена&lt;br /&gt;
записью&lt;br /&gt;
на диск.&lt;br /&gt;
&lt;br /&gt;
===Начальная оценка===&lt;br /&gt;
&lt;br /&gt;
Первым&lt;br /&gt;
делом&lt;br /&gt;
протестируйте&lt;br /&gt;
код в его текущем&lt;br /&gt;
состоянии.&lt;br /&gt;
Практически&lt;br /&gt;
всегда&lt;br /&gt;
желательно&lt;br /&gt;
запустить&lt;br /&gt;
программу&lt;br /&gt;
несколько&lt;br /&gt;
раз&lt;br /&gt;
подряд,&lt;br /&gt;
чтобы&lt;br /&gt;
выборка&lt;br /&gt;
был репрезентативной.&lt;br /&gt;
Это позволит&lt;br /&gt;
усреднить длительность&lt;br /&gt;
прогона,&lt;br /&gt;
которая&lt;br /&gt;
может&lt;br /&gt;
меняться&lt;br /&gt;
в зависимости&lt;br /&gt;
от нагрузки&lt;br /&gt;
процессора.&lt;br /&gt;
Лучше&lt;br /&gt;
всего&lt;br /&gt;
применить&lt;br /&gt;
скрипт-обертку,&lt;br /&gt;
вроде&lt;br /&gt;
такого:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl -w&lt;br /&gt;
 use strict;&lt;br /&gt;
 use Benchmark qw (:timethis);&lt;br /&gt;
 my $count = 10;&lt;br /&gt;
 timethis($count, sub {`/путь/к/программе`});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он написан&lt;br /&gt;
на ''Perl'', но поскольку&lt;br /&gt;
для вызова&lt;br /&gt;
тестируемого&lt;br /&gt;
кода&lt;br /&gt;
используются&lt;br /&gt;
обратные&lt;br /&gt;
апострофы&lt;br /&gt;
('''`'''), его можно&lt;br /&gt;
использовать&lt;br /&gt;
для хронометража&lt;br /&gt;
программы&lt;br /&gt;
на любом&lt;br /&gt;
языке,&lt;br /&gt;
запускаемой&lt;br /&gt;
из командной&lt;br /&gt;
строки.&lt;br /&gt;
В тексте&lt;br /&gt;
скрипта&lt;br /&gt;
вы заметите&lt;br /&gt;
'''$count''' – это&lt;br /&gt;
количество&lt;br /&gt;
итераций.&lt;br /&gt;
Другой&lt;br /&gt;
формат – знак минус&lt;br /&gt;
и минимальное&lt;br /&gt;
число&lt;br /&gt;
секунд&lt;br /&gt;
времени&lt;br /&gt;
процессора&lt;br /&gt;
на прогон:&lt;br /&gt;
например,&lt;br /&gt;
ввод '''-5''' приведет&lt;br /&gt;
к запуску&lt;br /&gt;
как минимум&lt;br /&gt;
на 5 секунд&lt;br /&gt;
процессорного&lt;br /&gt;
времени.&lt;br /&gt;
&lt;br /&gt;
''Benchmark.pm'', использованный&lt;br /&gt;
выше&lt;br /&gt;
модуль&lt;br /&gt;
''Perl'', удобен&lt;br /&gt;
также&lt;br /&gt;
и для тестирования&lt;br /&gt;
производительности&lt;br /&gt;
программ&lt;br /&gt;
не на ''Perl'': просто&lt;br /&gt;
применяйте&lt;br /&gt;
апострофы&lt;br /&gt;
для вызова&lt;br /&gt;
кода&lt;br /&gt;
из ''Perl''-скрипта,&lt;br /&gt;
как было&lt;br /&gt;
сделано&lt;br /&gt;
выше.&lt;br /&gt;
''Benchmark.pm'' обычно&lt;br /&gt;
поставляется&lt;br /&gt;
с достаточно&lt;br /&gt;
свежей&lt;br /&gt;
версией&lt;br /&gt;
''Perl'', но может&lt;br /&gt;
быть&lt;br /&gt;
установлен&lt;br /&gt;
и через&lt;br /&gt;
CPAN. Подправив&lt;br /&gt;
код, снова&lt;br /&gt;
воспользуйтесь&lt;br /&gt;
''Benchmark.pm'', чтобы&lt;br /&gt;
выяснить,&lt;br /&gt;
намного ли код стал быстрее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl -w&lt;br /&gt;
 use strict;&lt;br /&gt;
 use Benchmark qw (:all);&lt;br /&gt;
 cmpthese( 10, {&lt;br /&gt;
               a =&amp;gt; sub {`/путь/к/старомукоду`},&lt;br /&gt;
               a =&amp;gt; sub {`/путь/к/новомукоду`},&lt;br /&gt;
 })&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим,&lt;br /&gt;
что '''cmpthese''' сравнивает&lt;br /&gt;
количество&lt;br /&gt;
прогонов&lt;br /&gt;
кода&lt;br /&gt;
в секунду,&lt;br /&gt;
а не время&lt;br /&gt;
выполнения.&lt;br /&gt;
Однако&lt;br /&gt;
это может&lt;br /&gt;
быть полезнее,&lt;br /&gt;
чем абсолютное&lt;br /&gt;
время,&lt;br /&gt;
на которое&lt;br /&gt;
влияет&lt;br /&gt;
планировщик&lt;br /&gt;
ядра&lt;br /&gt;
и другие&lt;br /&gt;
системные&lt;br /&gt;
функции.&lt;br /&gt;
Скрипт-обертка&lt;br /&gt;
также&lt;br /&gt;
подавляет&lt;br /&gt;
любой&lt;br /&gt;
вывод&lt;br /&gt;
исследуемого&lt;br /&gt;
кода&lt;br /&gt;
в '''stdout'''. По умолчанию,&lt;br /&gt;
'''cmpthese''' работает&lt;br /&gt;
до ближайшего&lt;br /&gt;
целого&lt;br /&gt;
числа&lt;br /&gt;
секунд,&lt;br /&gt;
но можно&lt;br /&gt;
включить&lt;br /&gt;
высокоточный&lt;br /&gt;
таймер&lt;br /&gt;
при помощи&lt;br /&gt;
 use Benchmark qw (:hireswallclock);&lt;br /&gt;
чтобы&lt;br /&gt;
получать&lt;br /&gt;
значения&lt;br /&gt;
времен&lt;br /&gt;
в микросекундах.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Даже&lt;br /&gt;
если&lt;br /&gt;
у вас&lt;br /&gt;
в данный&lt;br /&gt;
момент&lt;br /&gt;
нет проблем&lt;br /&gt;
с быстродействием,&lt;br /&gt;
желательно&lt;br /&gt;
выполнить&lt;br /&gt;
пару&lt;br /&gt;
тестов&lt;br /&gt;
производительности&lt;br /&gt;
для&lt;br /&gt;
выявления&lt;br /&gt;
средних&lt;br /&gt;
значений.&lt;br /&gt;
Затем,&lt;br /&gt;
если&lt;br /&gt;
вам&lt;br /&gt;
покажется,&lt;br /&gt;
что&lt;br /&gt;
работа&lt;br /&gt;
стала&lt;br /&gt;
медленнее,&lt;br /&gt;
чем раньше,&lt;br /&gt;
вы сможете&lt;br /&gt;
сравнить&lt;br /&gt;
данные&lt;br /&gt;
и понять,&lt;br /&gt;
так ли&lt;br /&gt;
это, или просто&lt;br /&gt;
вы стали&lt;br /&gt;
менее&lt;br /&gt;
терпеливы.| Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
===Ведем записи===&lt;br /&gt;
&lt;br /&gt;
Обертки&lt;br /&gt;
выводят&lt;br /&gt;
все полученные&lt;br /&gt;
значения&lt;br /&gt;
времени&lt;br /&gt;
на консоль,&lt;br /&gt;
но вывод&lt;br /&gt;
можно&lt;br /&gt;
перенаправить&lt;br /&gt;
в файл (используйте&lt;br /&gt;
''wrapPer.pl &amp;gt;&amp;gt; benchmark.txt'', чтобы&lt;br /&gt;
результаты&lt;br /&gt;
каждого&lt;br /&gt;
прогона&lt;br /&gt;
добавлялись&lt;br /&gt;
к нему, не перезаписывая&lt;br /&gt;
старых), для отслеживания&lt;br /&gt;
прогресса.&lt;br /&gt;
&lt;br /&gt;
Учтите,&lt;br /&gt;
что, приступая&lt;br /&gt;
к редактированию,&lt;br /&gt;
всегда&lt;br /&gt;
следует&lt;br /&gt;
держать&lt;br /&gt;
под рукой&lt;br /&gt;
копию&lt;br /&gt;
старого&lt;br /&gt;
кода.&lt;br /&gt;
Это позволит&lt;br /&gt;
выполнить&lt;br /&gt;
сравнение (как показано&lt;br /&gt;
выше)&lt;br /&gt;
и проверить,&lt;br /&gt;
каких&lt;br /&gt;
результатов&lt;br /&gt;
вы достигли,&lt;br /&gt;
поскольку&lt;br /&gt;
при оптимизации&lt;br /&gt;
всегда&lt;br /&gt;
можно&lt;br /&gt;
внести&lt;br /&gt;
ошибку.&lt;br /&gt;
К тому&lt;br /&gt;
же это будет&lt;br /&gt;
той страховочной&lt;br /&gt;
сеткой,&lt;br /&gt;
что спасет&lt;br /&gt;
вас, если&lt;br /&gt;
вместо&lt;br /&gt;
улучшения&lt;br /&gt;
все рухнет. Вообще-то не мешает&lt;br /&gt;
использовать&lt;br /&gt;
систему&lt;br /&gt;
контроля&lt;br /&gt;
версий&lt;br /&gt;
и регулярно&lt;br /&gt;
фиксировать&lt;br /&gt;
в ней изменения:&lt;br /&gt;
эти усилия&lt;br /&gt;
окупаются&lt;br /&gt;
сторицей&lt;br /&gt;
благодаря&lt;br /&gt;
возможности&lt;br /&gt;
отката&lt;br /&gt;
на заведомо&lt;br /&gt;
работоспособную&lt;br /&gt;
версию,&lt;br /&gt;
когда&lt;br /&gt;
что-то идет не так.&lt;br /&gt;
&lt;br /&gt;
Итак, настал&lt;br /&gt;
момент запуска&lt;br /&gt;
первого&lt;br /&gt;
набора&lt;br /&gt;
простых&lt;br /&gt;
тестов. Помните, что во время&lt;br /&gt;
тестирования&lt;br /&gt;
не следует&lt;br /&gt;
запускать&lt;br /&gt;
другие&lt;br /&gt;
задачи,&lt;br /&gt;
иначе&lt;br /&gt;
результаты&lt;br /&gt;
собьют&lt;br /&gt;
вас с толку.&lt;br /&gt;
По&lt;br /&gt;
возможности&lt;br /&gt;
следует&lt;br /&gt;
также&lt;br /&gt;
выполнить&lt;br /&gt;
скрипт-обертку,&lt;br /&gt;
сам дающий&lt;br /&gt;
усредненные&lt;br /&gt;
результаты,&lt;br /&gt;
несколько&lt;br /&gt;
раз, и усреднить еще&lt;br /&gt;
и их, добиваясь&lt;br /&gt;
более&lt;br /&gt;
показательного&lt;br /&gt;
значения.&lt;br /&gt;
Убедитесь,&lt;br /&gt;
что&lt;br /&gt;
ничего&lt;br /&gt;
не загружаете:&lt;br /&gt;
это может&lt;br /&gt;
сказаться&lt;br /&gt;
на скорости&lt;br /&gt;
обработки&lt;br /&gt;
или ввода/вывода.&lt;br /&gt;
Желательно&lt;br /&gt;
выполнить&lt;br /&gt;
столько&lt;br /&gt;
прогонов,&lt;br /&gt;
на сколько&lt;br /&gt;
у вас хватит&lt;br /&gt;
времени&lt;br /&gt;
или терпения:&lt;br /&gt;
чем больше&lt;br /&gt;
прогонов,&lt;br /&gt;
тем точнее будет&lt;br /&gt;
результат.&lt;br /&gt;
&lt;br /&gt;
===Профилирование: расчленяем код===&lt;br /&gt;
&lt;br /&gt;
По получении&lt;br /&gt;
оценки,&lt;br /&gt;
следующий&lt;br /&gt;
шаг – логическое&lt;br /&gt;
деление&lt;br /&gt;
кода.&lt;br /&gt;
Просмотрите&lt;br /&gt;
его и выделите&lt;br /&gt;
разделы,&lt;br /&gt;
на которые&lt;br /&gt;
его можно&lt;br /&gt;
разбить.&lt;br /&gt;
Вот некоторые&lt;br /&gt;
предложения:&lt;br /&gt;
* раздел работы с диском (например, чтение или запись);&lt;br /&gt;
* создание и/или заполнение структур данных;&lt;br /&gt;
* алгоритмы и вычисления;&lt;br /&gt;
* какая-либо работа с сетью (но, вероятно, здесь ускорение будет вне вашего контроля).&lt;br /&gt;
&lt;br /&gt;
На данном&lt;br /&gt;
этапе&lt;br /&gt;
для компилируемых&lt;br /&gt;
языков&lt;br /&gt;
следует,&lt;br /&gt;
веро-&lt;br /&gt;
ятно,&lt;br /&gt;
слегка переделать&lt;br /&gt;
ваш код или разбить&lt;br /&gt;
его на части.&lt;br /&gt;
Вывод&lt;br /&gt;
на диск убрать&lt;br /&gt;
довольно&lt;br /&gt;
просто – для этого&lt;br /&gt;
иногда достаточно&lt;br /&gt;
пару&lt;br /&gt;
раз что-то закомментировать;&lt;br /&gt;
но ввод с диска выкинуть&lt;br /&gt;
сложнее, поскольку&lt;br /&gt;
для получения&lt;br /&gt;
результата&lt;br /&gt;
алгоритму&lt;br /&gt;
нужны&lt;br /&gt;
данные.&lt;br /&gt;
Вместо&lt;br /&gt;
этого&lt;br /&gt;
можно&lt;br /&gt;
поступить наоборот,&lt;br /&gt;
убрав&lt;br /&gt;
все, кроме&lt;br /&gt;
чтения; вычтите&lt;br /&gt;
среднее время&lt;br /&gt;
таких&lt;br /&gt;
прогонов&lt;br /&gt;
из среднего&lt;br /&gt;
времени&lt;br /&gt;
работы&lt;br /&gt;
полной&lt;br /&gt;
версии,&lt;br /&gt;
и получите&lt;br /&gt;
среднее время&lt;br /&gt;
работы&lt;br /&gt;
алгоритма.&lt;br /&gt;
&lt;br /&gt;
Для примера&lt;br /&gt;
допустим,&lt;br /&gt;
что имеется&lt;br /&gt;
три основных&lt;br /&gt;
раздела&lt;br /&gt;
кода:&lt;br /&gt;
чтение данных,&lt;br /&gt;
проведение&lt;br /&gt;
вычислений&lt;br /&gt;
и запись новых&lt;br /&gt;
данных.&lt;br /&gt;
Создайте&lt;br /&gt;
три версии&lt;br /&gt;
вашего&lt;br /&gt;
кода:&lt;br /&gt;
&lt;br /&gt;
: '''A''': Полная версия&lt;br /&gt;
: '''B''': Только чтение данных (без расчетов и вывода).&lt;br /&gt;
: '''C''': Чтение данных и вычисления (без вывода).&lt;br /&gt;
&lt;br /&gt;
Пусть тестирование&lt;br /&gt;
трех этих версий&lt;br /&gt;
дало&lt;br /&gt;
следующее:&lt;br /&gt;
версия&lt;br /&gt;
'''А''' выполняется&lt;br /&gt;
4 секунды,&lt;br /&gt;
'''B''' – 1 секунду&lt;br /&gt;
и '''C''' – 3,5 секунды.&lt;br /&gt;
То есть&lt;br /&gt;
чтение данных&lt;br /&gt;
занимает&lt;br /&gt;
1 секунду&lt;br /&gt;
(из '''B'''). Вывод&lt;br /&gt;
данных&lt;br /&gt;
занимает&lt;br /&gt;
0,5 секунды&lt;br /&gt;
(разность&lt;br /&gt;
между&lt;br /&gt;
'''А''' и '''С''').&lt;br /&gt;
И, следовательно,&lt;br /&gt;
вычисления&lt;br /&gt;
идут&lt;br /&gt;
2,5 секунды.&lt;br /&gt;
Вы можете&lt;br /&gt;
найти&lt;br /&gt;
это по&lt;br /&gt;
формуле&lt;br /&gt;
'''A – B''' – вывод&lt;br /&gt;
данных = время&lt;br /&gt;
работы&lt;br /&gt;
(в нашем&lt;br /&gt;
случае&lt;br /&gt;
4 – 1 – 0,5 = 2,5).&lt;br /&gt;
Вот время,&lt;br /&gt;
требуемое&lt;br /&gt;
для работы&lt;br /&gt;
без ввода&lt;br /&gt;
и вывода&lt;br /&gt;
данных.&lt;br /&gt;
&lt;br /&gt;
Вы можете&lt;br /&gt;
использовать&lt;br /&gt;
данный&lt;br /&gt;
метод&lt;br /&gt;
при хронометраже&lt;br /&gt;
других&lt;br /&gt;
участков&lt;br /&gt;
кода,&lt;br /&gt;
которые&lt;br /&gt;
трудно&lt;br /&gt;
отделить.&lt;br /&gt;
&lt;br /&gt;
Альтернатива – выводить&lt;br /&gt;
в контрольных&lt;br /&gt;
точках&lt;br /&gt;
системное&lt;br /&gt;
время.&lt;br /&gt;
Скрипт ''Perl'', приведенный&lt;br /&gt;
ниже, cгенерирует при запуске&lt;br /&gt;
по одной&lt;br /&gt;
строке&lt;br /&gt;
на прогон&lt;br /&gt;
кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl -w&lt;br /&gt;
 use strict;&lt;br /&gt;
 use Time::HiRes;&lt;br /&gt;
 sub time_print;&lt;br /&gt;
 print time_print . “:”;&lt;br /&gt;
 # здесь код&lt;br /&gt;
 print time_print . “:”;&lt;br /&gt;
 # еще код&lt;br /&gt;
 print time_print . “\n”;&lt;br /&gt;
&lt;br /&gt;
 sub printtime {&lt;br /&gt;
   my ($t1,$t2) = Time::HiRes::gettimeofday;&lt;br /&gt;
   my $time = “$t1.” . sprintf(“%05d”,$t2/10);&lt;br /&gt;
   return “$time”;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и выдаст нечто подобное:&lt;br /&gt;
&lt;br /&gt;
 1240905933.05204:1240905934.05249:1240905935.05264:1240905936.05312&lt;br /&gt;
&lt;br /&gt;
Значения&lt;br /&gt;
в этих парах&lt;br /&gt;
разделяются&lt;br /&gt;
точками,&lt;br /&gt;
а пары&lt;br /&gt;
отделены&lt;br /&gt;
двоеточием.&lt;br /&gt;
Значения&lt;br /&gt;
в паре – в секундах,&lt;br /&gt;
прошедших&lt;br /&gt;
с начала&lt;br /&gt;
эпохи,&lt;br /&gt;
и в микросекундах;&lt;br /&gt;
первое – время&lt;br /&gt;
запуска&lt;br /&gt;
скрипта,&lt;br /&gt;
а второе – время&lt;br /&gt;
завершения.&lt;br /&gt;
Использование&lt;br /&gt;
модуля&lt;br /&gt;
''Time::HiRes''&lt;br /&gt;
позволяет&lt;br /&gt;
выполнять&lt;br /&gt;
подсчет&lt;br /&gt;
в микросекундах,&lt;br /&gt;
а не в целых&lt;br /&gt;
секундах.&lt;br /&gt;
&lt;br /&gt;
===Вычисление времени===&lt;br /&gt;
&lt;br /&gt;
Альтернативой&lt;br /&gt;
для хронометража&lt;br /&gt;
при использовании&lt;br /&gt;
''Perl'' и ''Benchmark''&lt;br /&gt;
является&lt;br /&gt;
вычисление&lt;br /&gt;
разности&lt;br /&gt;
времен&lt;br /&gt;
при помощи&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 my $t1 = new Benchmark;&lt;br /&gt;
 # code&lt;br /&gt;
 my $t2 = new Benchmark;&lt;br /&gt;
 my $td = timediff($t1, $t2);&lt;br /&gt;
 print “Первый раздел потребовал $td \n”;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако&lt;br /&gt;
такой&lt;br /&gt;
результат&lt;br /&gt;
труднее&lt;br /&gt;
обрабатывать&lt;br /&gt;
автоматически.&lt;br /&gt;
&lt;br /&gt;
===Обработка данных===&lt;br /&gt;
&lt;br /&gt;
Выполните&lt;br /&gt;
код несколько&lt;br /&gt;
раз, перенаправляя&lt;br /&gt;
вывод&lt;br /&gt;
в файл,&lt;br /&gt;
а затем&lt;br /&gt;
воспользуйтесь&lt;br /&gt;
следующим&lt;br /&gt;
скриптом&lt;br /&gt;
''Perl'' для его&lt;br /&gt;
обработки:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF121_36_1.jpg|300px]] Запуск обработчика вывода для выполнения базового профилирования участков кода|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl -w&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $datafile = “testout.txt”;&lt;br /&gt;
 my @timearray;&lt;br /&gt;
 my $count = 0;&lt;br /&gt;
 &lt;br /&gt;
 open DATA, $datafile;&lt;br /&gt;
 while (&amp;lt;DATA&amp;gt;){&lt;br /&gt;
   my @time = split /:/;&lt;br /&gt;
   push @{ $timearray[$count] }, @time;&lt;br /&gt;
   $count++;&lt;br /&gt;
 }&lt;br /&gt;
 close DATA;&lt;br /&gt;
&lt;br /&gt;
 my @result;&lt;br /&gt;
 for my $rowref ( @timearray ) {&lt;br /&gt;
   my @row = @$rowref;&lt;br /&gt;
   for my $i ( 0 .. ($#row – 1) ) {&lt;br /&gt;
   $result[$i] += $row[$i+1] – $row[$i];&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 for my $i ( 0 .. $#result ) {&lt;br /&gt;
 print “Section “ . ($i+1) . “ average = “ . $result[$i] / $count . “\n”;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это приведет&lt;br /&gt;
к выводу&lt;br /&gt;
результата&lt;br /&gt;
(как показано&lt;br /&gt;
на экранном&lt;br /&gt;
снимке),&lt;br /&gt;
но учтите,&lt;br /&gt;
что скрипт-тест выполнялся&lt;br /&gt;
три&lt;br /&gt;
раза, а этого&lt;br /&gt;
мало&lt;br /&gt;
для правильного&lt;br /&gt;
профилирования.&lt;br /&gt;
&lt;br /&gt;
Теперь&lt;br /&gt;
вы должны&lt;br /&gt;
иметь представление&lt;br /&gt;
о длительности&lt;br /&gt;
выполнения&lt;br /&gt;
вашего&lt;br /&gt;
кода&lt;br /&gt;
в целом,&lt;br /&gt;
а также&lt;br /&gt;
его отдельных&lt;br /&gt;
частей.&lt;br /&gt;
Следующий&lt;br /&gt;
шаг – ускорение.&lt;br /&gt;
&lt;br /&gt;
===Решение проблем===&lt;br /&gt;
&lt;br /&gt;
Как указывалось&lt;br /&gt;
выше,&lt;br /&gt;
важно&lt;br /&gt;
найти&lt;br /&gt;
в вашем&lt;br /&gt;
коде&lt;br /&gt;
узкое&lt;br /&gt;
место,&lt;br /&gt;
чтобы&lt;br /&gt;
сосредоточить&lt;br /&gt;
усилия&lt;br /&gt;
там, где от этого&lt;br /&gt;
будет&lt;br /&gt;
больше&lt;br /&gt;
всего&lt;br /&gt;
пользы.&lt;br /&gt;
Не исключено,&lt;br /&gt;
что вы распознаете&lt;br /&gt;
проблемный&lt;br /&gt;
кусок&lt;br /&gt;
кода,&lt;br /&gt;
просто&lt;br /&gt;
поглядев&lt;br /&gt;
на цифры;&lt;br /&gt;
а если&lt;br /&gt;
не получится,&lt;br /&gt;
постройте&lt;br /&gt;
графики&lt;br /&gt;
с помощью&lt;br /&gt;
''OOo, KChart, Guppi'' или ''Graphviz''. Кто предпочитает&lt;br /&gt;
работать&lt;br /&gt;
в консоли,&lt;br /&gt;
может&lt;br /&gt;
взять ''gnuplot''.&lt;br /&gt;
&lt;br /&gt;
Если&lt;br /&gt;
ваш код полон&lt;br /&gt;
операций&lt;br /&gt;
ввода/вывода,&lt;br /&gt;
весьма&lt;br /&gt;
вероятно,&lt;br /&gt;
что они-то и есть узкое&lt;br /&gt;
место.&lt;br /&gt;
Скорость&lt;br /&gt;
можно&lt;br /&gt;
увеличить&lt;br /&gt;
при помощи&lt;br /&gt;
следующих&lt;br /&gt;
шагов:&lt;br /&gt;
* Обеспечьте работу локально, а не в сети. Завершив работу с файлами, перекинуть их на удаленные диски вы всегда успеете.&lt;br /&gt;
* Приобретите новую периферию. Возможно, ваша старая просто уже не на высоте. Вы можете бросить ее на те участки, где скорость менее важна.&lt;br /&gt;
* Выполняйте операции ввода/вывода пакетно. Например, считайте данные все разом, а затем уже обрабатывайте их в памяти. Если код выполняется несколько раз, то создайте процедуру чтения данных один раз в самом начале. &lt;br /&gt;
* Понизьте «уступчивость» (nice-значение) своего процесса.&lt;br /&gt;
&lt;br /&gt;
Для просмотра&lt;br /&gt;
текущих&lt;br /&gt;
параметров&lt;br /&gt;
диска можно&lt;br /&gt;
применить&lt;br /&gt;
''hdparm'' (например, ''hdparm -v /dev/hda''). Можно&lt;br /&gt;
увеличить&lt;br /&gt;
скорость&lt;br /&gt;
работы&lt;br /&gt;
накопителя&lt;br /&gt;
лобовой&lt;br /&gt;
атакой&lt;br /&gt;
– включить&lt;br /&gt;
прямой&lt;br /&gt;
доступ&lt;br /&gt;
к памяти&lt;br /&gt;
(Direct Memory Access, DMA) (''hdparm -d1 /dev/hda'');&lt;br /&gt;
затем&lt;br /&gt;
вновь оцените быстродействие&lt;br /&gt;
и посмотрите,&lt;br /&gt;
сработало&lt;br /&gt;
ли&lt;br /&gt;
это. Также&lt;br /&gt;
можно&lt;br /&gt;
изменить&lt;br /&gt;
значение&lt;br /&gt;
поддержки&lt;br /&gt;
ввода/вывода&lt;br /&gt;
(I/O support) опцией&lt;br /&gt;
'''-c3''', это также&lt;br /&gt;
способно&lt;br /&gt;
слегка&lt;br /&gt;
улучшить&lt;br /&gt;
быстродействие.&lt;br /&gt;
Поэкспериментируйте&lt;br /&gt;
с другими&lt;br /&gt;
значениями&lt;br /&gt;
''hdparm'', но будьте&lt;br /&gt;
осторожны:&lt;br /&gt;
некоторые&lt;br /&gt;
из них могут&lt;br /&gt;
быть&lt;br /&gt;
опасны.&lt;br /&gt;
Перед&lt;br /&gt;
выполнением&lt;br /&gt;
действий&lt;br /&gt;
почитайте&lt;br /&gt;
man-страницу.&lt;br /&gt;
При желании&lt;br /&gt;
сохранить&lt;br /&gt;
произведенные&lt;br /&gt;
изменения,&lt;br /&gt;
выполните&lt;br /&gt;
''hdparm -k /dev/hda''.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Опция '''relatime''' – это улучшенная версия '''noatime'''; если вы используете Ubuntu, не мешает ее попробовать.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
===Подгонка файловой системы===&lt;br /&gt;
&lt;br /&gt;
Вы можете&lt;br /&gt;
ускорить&lt;br /&gt;
доступ к файлам,&lt;br /&gt;
отключив&lt;br /&gt;
ведение&lt;br /&gt;
временных&lt;br /&gt;
отметок&lt;br /&gt;
при каждом&lt;br /&gt;
обращении&lt;br /&gt;
к ним – то есть не делая&lt;br /&gt;
запись&lt;br /&gt;
в каталог&lt;br /&gt;
при каждом&lt;br /&gt;
открытии&lt;br /&gt;
файла.&lt;br /&gt;
Для этого&lt;br /&gt;
отредактируйте&lt;br /&gt;
'''/etc/fstab''', добавив&lt;br /&gt;
'''noatime''' к списку&lt;br /&gt;
опций&lt;br /&gt;
в четвертом&lt;br /&gt;
столбце&lt;br /&gt;
для каждой&lt;br /&gt;
ФС, которую&lt;br /&gt;
вы хотите&lt;br /&gt;
изменить,&lt;br /&gt;
а потом&lt;br /&gt;
все&lt;br /&gt;
перемонтируйте&lt;br /&gt;
командой&lt;br /&gt;
''mount -a''. Однако&lt;br /&gt;
отсутствие&lt;br /&gt;
записей&lt;br /&gt;
о доступе&lt;br /&gt;
к файлу&lt;br /&gt;
способно&lt;br /&gt;
вызвать&lt;br /&gt;
проблемы&lt;br /&gt;
в некоторых&lt;br /&gt;
программах:&lt;br /&gt;
почтовых&lt;br /&gt;
или резервного&lt;br /&gt;
копирования.&lt;br /&gt;
Хотя&lt;br /&gt;
можно&lt;br /&gt;
создать&lt;br /&gt;
для своего&lt;br /&gt;
приложения&lt;br /&gt;
отдельный&lt;br /&gt;
раздел&lt;br /&gt;
и использовать&lt;br /&gt;
'''noatime''' только&lt;br /&gt;
в нем.&lt;br /&gt;
&lt;br /&gt;
Если&lt;br /&gt;
вы решили&lt;br /&gt;
купить&lt;br /&gt;
новое&lt;br /&gt;
оборудование,&lt;br /&gt;
то прежде&lt;br /&gt;
чем&lt;br /&gt;
тратить&lt;br /&gt;
деньги,&lt;br /&gt;
попробуйте&lt;br /&gt;
одолжить&lt;br /&gt;
на время&lt;br /&gt;
чью-нибудь машину&lt;br /&gt;
с искомыми&lt;br /&gt;
характеристиками&lt;br /&gt;
и провести&lt;br /&gt;
несколько&lt;br /&gt;
тестов&lt;br /&gt;
производительности&lt;br /&gt;
приложения.&lt;br /&gt;
Лучше&lt;br /&gt;
знать заранее,&lt;br /&gt;
чего&lt;br /&gt;
вы добьетесь.&lt;br /&gt;
&lt;br /&gt;
Если&lt;br /&gt;
узкое&lt;br /&gt;
место – ваш алгоритм,&lt;br /&gt;
то имеется&lt;br /&gt;
много&lt;br /&gt;
ресурсов&lt;br /&gt;
для их анализа.&lt;br /&gt;
Например,&lt;br /&gt;
хорошо&lt;br /&gt;
изучены&lt;br /&gt;
алгоритмы&lt;br /&gt;
сортировки,&lt;br /&gt;
что позволяет&lt;br /&gt;
выбрать&lt;br /&gt;
из них оптимальный&lt;br /&gt;
для ваших&lt;br /&gt;
данных – например,&lt;br /&gt;
сортировка&lt;br /&gt;
при помощи&lt;br /&gt;
двоичного&lt;br /&gt;
дерева&lt;br /&gt;
в общем&lt;br /&gt;
случае&lt;br /&gt;
лучше,&lt;br /&gt;
чем пузырьковая.&lt;br /&gt;
Впрочем,&lt;br /&gt;
это выходит&lt;br /&gt;
за рамки&lt;br /&gt;
данной&lt;br /&gt;
статьи&lt;br /&gt;
– в сети&lt;br /&gt;
есть множество&lt;br /&gt;
информации&lt;br /&gt;
для исследования.&lt;br /&gt;
&lt;br /&gt;
Имейте&lt;br /&gt;
в виду,&lt;br /&gt;
что оптимизация&lt;br /&gt;
алгоритма – работа&lt;br /&gt;
крайне&lt;br /&gt;
тяжелая,&lt;br /&gt;
и следует&lt;br /&gt;
убедиться,&lt;br /&gt;
что итогом&lt;br /&gt;
потраченного&lt;br /&gt;
времени&lt;br /&gt;
не будет&lt;br /&gt;
жалкая&lt;br /&gt;
мелочевка.&lt;br /&gt;
Но иногда правильный&lt;br /&gt;
выбор&lt;br /&gt;
алгоритма&lt;br /&gt;
приводит&lt;br /&gt;
к радикальным&lt;br /&gt;
переменам.&lt;br /&gt;
&lt;br /&gt;
===Параллельная обработка===&lt;br /&gt;
&lt;br /&gt;
Если&lt;br /&gt;
алгоритм&lt;br /&gt;
больше&lt;br /&gt;
уже не улучшается,&lt;br /&gt;
попробуйте&lt;br /&gt;
распараллелить&lt;br /&gt;
обработку.&lt;br /&gt;
Возможно,&lt;br /&gt;
для этого&lt;br /&gt;
придется&lt;br /&gt;
изменить&lt;br /&gt;
подход&lt;br /&gt;
к написанию&lt;br /&gt;
кода,&lt;br /&gt;
разветвив&lt;br /&gt;
свои действия&lt;br /&gt;
на несколько&lt;br /&gt;
параллельных&lt;br /&gt;
потоков.&lt;br /&gt;
Например,&lt;br /&gt;
при выполнении&lt;br /&gt;
анализа&lt;br /&gt;
объемного&lt;br /&gt;
набора&lt;br /&gt;
данных,&lt;br /&gt;
части&lt;br /&gt;
которого&lt;br /&gt;
не взаимодействуют&lt;br /&gt;
друг с другом,&lt;br /&gt;
попытайтесь&lt;br /&gt;
запустить&lt;br /&gt;
один и тот же алгоритм&lt;br /&gt;
сразу&lt;br /&gt;
на нескольких&lt;br /&gt;
машинах,&lt;br /&gt;
с разными&lt;br /&gt;
частями&lt;br /&gt;
данных.&lt;br /&gt;
В данной&lt;br /&gt;
статье&lt;br /&gt;
нет места&lt;br /&gt;
для детального&lt;br /&gt;
рассмотрения,&lt;br /&gt;
но начать&lt;br /&gt;
можно&lt;br /&gt;
с учебников,&lt;br /&gt;
имеющихся&lt;br /&gt;
в сети.&lt;br /&gt;
Увы, не все задачи&lt;br /&gt;
распараллеливаются!&lt;br /&gt;
&lt;br /&gt;
===''Strace'' и ''ltrace''===&lt;br /&gt;
&lt;br /&gt;
''Strace'' выводит&lt;br /&gt;
список&lt;br /&gt;
системных&lt;br /&gt;
вызовов,&lt;br /&gt;
выполненных&lt;br /&gt;
программой.&lt;br /&gt;
Обычно&lt;br /&gt;
для тестирования&lt;br /&gt;
это перебор,&lt;br /&gt;
но тут есть пара&lt;br /&gt;
полезных&lt;br /&gt;
опций.&lt;br /&gt;
Например, '''-c''' записывает&lt;br /&gt;
время&lt;br /&gt;
каждого&lt;br /&gt;
системного&lt;br /&gt;
вызова, '''-r''' выводит&lt;br /&gt;
относительное&lt;br /&gt;
время&lt;br /&gt;
каждого&lt;br /&gt;
системного&lt;br /&gt;
вызова,&lt;br /&gt;
а '''-t''' – абсолютное&lt;br /&gt;
(для включения&lt;br /&gt;
микросекунд&lt;br /&gt;
используйте&lt;br /&gt;
'''-tt'''). '''-T''' выводит&lt;br /&gt;
время,&lt;br /&gt;
потраченное&lt;br /&gt;
на системный&lt;br /&gt;
вызов.&lt;br /&gt;
С опцией '''-e''' будут&lt;br /&gt;
отслеживаться&lt;br /&gt;
только&lt;br /&gt;
определенные&lt;br /&gt;
наборы&lt;br /&gt;
системных&lt;br /&gt;
вызовов.&lt;br /&gt;
&lt;br /&gt;
''ltrace'' выполняет&lt;br /&gt;
то же самое,&lt;br /&gt;
но для библиотечных&lt;br /&gt;
вызовов.&lt;br /&gt;
И вновь '''-c''' посчитает&lt;br /&gt;
время&lt;br /&gt;
вызовов&lt;br /&gt;
и возвратит&lt;br /&gt;
сводку,&lt;br /&gt;
а '''-t''' и '''-tt''' покажут&lt;br /&gt;
время&lt;br /&gt;
суток&lt;br /&gt;
при запуске&lt;br /&gt;
каждой&lt;br /&gt;
строки.&lt;br /&gt;
&lt;br /&gt;
===Заключение===&lt;br /&gt;
&lt;br /&gt;
Для получения&lt;br /&gt;
более&lt;br /&gt;
подробной&lt;br /&gt;
информации&lt;br /&gt;
о том, где тормозит&lt;br /&gt;
ваш ''Perl''-код, можно&lt;br /&gt;
запустить&lt;br /&gt;
''Devel::NYTProf'' или его предшественника&lt;br /&gt;
''Devel::DProf'' – это всеобъемлющие&lt;br /&gt;
профилировщики&lt;br /&gt;
с хорошей&lt;br /&gt;
документацией.&lt;br /&gt;
Используя&lt;br /&gt;
данные&lt;br /&gt;
инструменты,&lt;br /&gt;
вы сможете&lt;br /&gt;
найти&lt;br /&gt;
проблемные&lt;br /&gt;
места конкретных&lt;br /&gt;
модулей&lt;br /&gt;
и обдумать&lt;br /&gt;
пути&lt;br /&gt;
их исправления.&lt;br /&gt;
Не забудьте&lt;br /&gt;
потом&lt;br /&gt;
опять выполнить&lt;br /&gt;
профилирование,&lt;br /&gt;
чтобы&lt;br /&gt;
проверить,&lt;br /&gt;
есть ли сдвиг.&lt;br /&gt;
&lt;br /&gt;
Если&lt;br /&gt;
вы используете&lt;br /&gt;
''Perl'' или другой&lt;br /&gt;
скриптовый&lt;br /&gt;
язык, и способов&lt;br /&gt;
ускорения&lt;br /&gt;
кода&lt;br /&gt;
не обнаруживается,&lt;br /&gt;
а быстродействие&lt;br /&gt;
совершено&lt;br /&gt;
неприемлемо,&lt;br /&gt;
то, возможно,&lt;br /&gt;
надо&lt;br /&gt;
перейти&lt;br /&gt;
на компилируемый&lt;br /&gt;
язык – типа&lt;br /&gt;
''C, C++'' или ''Java''. Однако,&lt;br /&gt;
прежде&lt;br /&gt;
чем&lt;br /&gt;
погрузиться&lt;br /&gt;
в это и полностью&lt;br /&gt;
переделать&lt;br /&gt;
код, следует&lt;br /&gt;
хорошенько&lt;br /&gt;
убедиться,&lt;br /&gt;
что это действительно&lt;br /&gt;
стоит&lt;br /&gt;
вашего&lt;br /&gt;
времени&lt;br /&gt;
и затраты&lt;br /&gt;
усилий.&lt;br /&gt;
Еще раз рассмотрите&lt;br /&gt;
результаты&lt;br /&gt;
тестирования&lt;br /&gt;
и убедитесь,&lt;br /&gt;
что сделали&lt;br /&gt;
все возможное&lt;br /&gt;
для ускорения&lt;br /&gt;
и дальше&lt;br /&gt;
здесь ехать некуда.&lt;br /&gt;
&lt;br /&gt;
По завершении&lt;br /&gt;
оптимизации&lt;br /&gt;
выбранного&lt;br /&gt;
раздела&lt;br /&gt;
кода&lt;br /&gt;
весьма&lt;br /&gt;
важно&lt;br /&gt;
проверить,&lt;br /&gt;
что ваш новый&lt;br /&gt;
код работает&lt;br /&gt;
так же, как&lt;br /&gt;
старый.&lt;br /&gt;
Лучший&lt;br /&gt;
способ&lt;br /&gt;
сделать&lt;br /&gt;
это – модульные&lt;br /&gt;
тесты, и это&lt;br /&gt;
еще один повод&lt;br /&gt;
сохранить&lt;br /&gt;
старый&lt;br /&gt;
код, чтобы&lt;br /&gt;
сравнить две версии.&lt;br /&gt;
Во время&lt;br /&gt;
оптимизации&lt;br /&gt;
вполне вероятно насажать&lt;br /&gt;
ошибок.&lt;br /&gt;
Делайте&lt;br /&gt;
заметки&lt;br /&gt;
обо всех изменениях,&lt;br /&gt;
чтобы&lt;br /&gt;
не повторять&lt;br /&gt;
ошибок&lt;br /&gt;
в будущем&lt;br /&gt;
и не забыть,&lt;br /&gt;
что вы делали,&lt;br /&gt;
на случай&lt;br /&gt;
выполнения&lt;br /&gt;
схожих&lt;br /&gt;
операций.&lt;br /&gt;
&lt;br /&gt;
На данном&lt;br /&gt;
этапе&lt;br /&gt;
надо&lt;br /&gt;
снова&lt;br /&gt;
протестировать&lt;br /&gt;
производительность!&lt;br /&gt;
Выясните,&lt;br /&gt;
сколько&lt;br /&gt;
времени&lt;br /&gt;
вы сэкономили&lt;br /&gt;
(не позабыв&lt;br /&gt;
отметить,&lt;br /&gt;
сколько&lt;br /&gt;
рабочего&lt;br /&gt;
времени&lt;br /&gt;
ушло&lt;br /&gt;
на поправки)&lt;br /&gt;
и нельзя&lt;br /&gt;
ли&lt;br /&gt;
выиграть&lt;br /&gt;
еще. Если&lt;br /&gt;
нужно&lt;br /&gt;
избавиться&lt;br /&gt;
еще от пары&lt;br /&gt;
секунд,&lt;br /&gt;
посмотрите,&lt;br /&gt;
может&lt;br /&gt;
ли помочь&lt;br /&gt;
еще что-то? Или необходимо&lt;br /&gt;
переделывать&lt;br /&gt;
весь код заново?&lt;br /&gt;
&lt;br /&gt;
Процесс&lt;br /&gt;
тестирования&lt;br /&gt;
производительности&lt;br /&gt;
и оптимизации&lt;br /&gt;
кода&lt;br /&gt;
– весьма&lt;br /&gt;
увлекательное&lt;br /&gt;
занятие,&lt;br /&gt;
если&lt;br /&gt;
приступать&lt;br /&gt;
к нему&lt;br /&gt;
с ясным&lt;br /&gt;
представлением&lt;br /&gt;
о цели.&lt;br /&gt;
Однако&lt;br /&gt;
это может&lt;br /&gt;
стать источником&lt;br /&gt;
досады,&lt;br /&gt;
если&lt;br /&gt;
вы поленитесь&lt;br /&gt;
сперва&lt;br /&gt;
все тщательно&lt;br /&gt;
обдумать.&lt;br /&gt;
Убедитесь,&lt;br /&gt;
что ваш случай – первый,&lt;br /&gt;
и наслаждайтесь&lt;br /&gt;
переработкой&lt;br /&gt;
своих&lt;br /&gt;
алгоритмов&lt;br /&gt;
и перерасходом&lt;br /&gt;
на сверкающее&lt;br /&gt;
новое&lt;br /&gt;
оборудование. '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>