<?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; Evgeniy Ryzhkov</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/evgeniy-ryzhkov/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description></description>
	<lastBuildDate>Thu, 24 May 2012 12:16:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Что поражает меня при разработке статического анализатора кода</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/11/24/2006125/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/24/2006125/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 17:20:55 +0000</pubDate>
		<dc:creator>Evgeniy Ryzhkov</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[PVS]]></category>
		<category><![CDATA[статический анализ кода]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/24/2006125/</guid>
		<description><![CDATA[<p>При разработке любого инструмента для программистов, будь то компилятор, статический анализатор или что-то еще естественно используются тестовые проекты, на которых этот инструмент постоянно гоняется. Например, при разработке статического анализатора мы прогоняем его на базе из 70 реальных проектов. Это позволяет быть уверенным, что все в порядке и ничего не отломалось. Кроме того, когда мы разрабатываем новые правила диагностики ошибок, после прогона мы видим, в каких фрагментах кода выявлены новые ошибки. Все логично и очевидно. Так почему же такой заголовок?</p>]]></description>
			<content:encoded><![CDATA[<p>При разработке любого инструмента для программистов, будь то компилятор, статический анализатор или что-то еще естественно используются тестовые проекты, на которых этот инструмент постоянно гоняется. Например, при разработке статического анализатора мы прогоняем его на базе из 70 реальных проектов. Это позволяет быть уверенным, что все в порядке и ничего не отломалось. Кроме того, когда мы разрабатываем новые правила диагностики ошибок, после прогона мы видим, в каких фрагментах кода выявлены новые ошибки. Все логично и очевидно. Так почему же такой заголовок?</p>
<p>Дело в том, что тестовая база проектов – явление довольно устоявшееся у нас. Давно уже написаны статьи про ошибки в <a href="http://www.viva64.com/ru/a/0073/">eMule</a>, <a href="http://www.viva64.com/ru/b/0082/">WinMerge</a>, <a href="http://www.viva64.com/ru/b/0085/">TortoiseSVN</a>... И, казалось бы, что все эти тестовые проекты изучены нами вдоль и поперек. А получается, что нет. Ведь вновь и вновь в коде удается найти новые забавные фрагменты кода. </p>
<p>Вот пример:</p>
<pre name="code" class="cpp">void CIrcMain::Disconnect(bool bIsShuttingDown)
{
 m_pIrcSocket-&gt;Close();
 if (m_pIrcSocket != NULL)
  delete m_pIrcSocket;
}</pre>
<p>Код, в общем-то, может даже и работает. В некоторых случаях. Иногда. Когда m_pIrcSocket не NULL. Правда автор не уверен, что m_pIrcSocket всегда будет не NULL и добавил проверку. Но ПОСЛЕ использования. Соответственно, если данный код будет выполнен при m_pIrcSocket, то получим падение, хотя и проверка на NULL есть.</p>
<p>Еще один пример точного такого же плана:</p>
<pre name="code" class="cpp">  if (!frmExist)
  {
    frmExist =
       tag-&gt;Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
  }

  if (NULL != tag &amp;&amp; NULL != data)
  {</pre>
<p>Здесь сначала разыменовывается переменная tag и лишь затем она проверяется. Вопрос все тот же, если автор уверен, что tag не NULL, то зачем он проверяет, а если не уверен, то проверка должна быть раньше.</p>
<p>Так вот, возвращаясь к вопросу, вынесенному в заголовок заметки. Что поражает меня – так это то, что хотя мы много ошибок в коде УЖЕ нашли в наших тестовых проектах, мы все продолжаем и продолжаем находить новые ошибки.  С одной стороны это логично, ведь анализатор развивается и соответственно находит что-то новое. С другой – поразительно. Ведь, казалось бы, мы уже столько смотрели на эти тестовые проекты и неужели в них можно найти что-то новое. Оказывается можно. </p>
<p>Ну и совсем уж очевидный вывод – оказывается, анализатором кода смело можно прогонять свой проект еще, и еще, и еще. Ведь помимо ошибок в новом коде, который только недавно был написан, можно найти и новые ошибки в старом коде.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/24/2006125/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проблемы 64-битного кода в реальных программах: а что же Linux?</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/10/15/64-linux/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/10/15/64-linux/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 14:50:08 +0000</pubDate>
		<dc:creator>Evgeniy Ryzhkov</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2010/10/15/64-linux/</guid>
		<description><![CDATA[Рассказывая про 64-битные ошибки, поджидающие программистов при миграции их программ, я часто слышу упреки: "Ну да, этот ваш Windows, он такой... Хорошо, что в Linux с 64-битным кодом проблем да-а-а-авно уже нет".<br/>
"А вот и нет, мой любознательный читатель"]]></description>
			<content:encoded><![CDATA[<p>Рассказывая про 64-битные ошибки, поджидающие программистов при миграции их программ, я часто слышу упреки: "Ну да, этот ваш Windows, он такой... Хорошо, что в Linux с 64-битным кодом проблем да-а-а-авно уже нет".</p>
<p>"А вот и нет, мой любознательный читатель". Сегодняшний пост про 64-битную ошибку  в ядре Linux.  Чудесный сайт с системой отслеживания  ошибок (bug tracking system) разработчиков ядра содержит описание <a href="https://bugzilla.kernel.org/show_bug.cgi?id=16603" target="_blank">bug 16603</a> (send of data &gt; 4 GB fails on 64 bit systems). Суть проблемы проста: "Отправка  данных с использованием Linux-функции send() приводит к ошибке, если размер данных слишком большой. Функция из glibc выглядит так:</p>
<pre name="code" class="cpp">ssize_t send(int sockfd, const void *buf, size_t len, int flags);</pre>
<p>Все корректно, размер передается как memsize-тип <a href="http://www.viva64.com/terminology/size_t_rus.html">size_t</a>. Однако этот аргумент сохраняется в структуре msgheader, после чего внутри функции tcp_sendmsg идут строки:</p>
<pre name="code" class="cpp">while (--iovlen &gt;= 0) {
                int seglen = iov-&gt;iov_len;
                unsigned char __user *from = iov-&gt;iov_base;</pre>
<p>Здесь длина уже сохраняется в int, что, конечно же, никуда не годится. То есть отправка с помощью send() блока в 5 гигабайт приведет к отправке только 1 гигабайта, а отправка блока в 4 гигабайта не даст ничего (из-за "округления" до нуля).</p>
<p>Конечно, workaround понятен - указывать длину не более 0x8000000, но это ошибка и конечно же ее надо править.</p>
<p>Да, и это не из девяностых пример. Баг открыт в августе 2010 года, относится к ядру версии 2.5. И пока (11 октября 2010) не закрыт.  А вы говорите в Linux 64-битных проблем нет...</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/10/15/64-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пять дней на исправление ошибки в два символа, или миф о всемогущих технологиях при разработке программ</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/09/01/2003906/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/09/01/2003906/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 07:15:01 +0000</pubDate>
		<dc:creator>Evgeniy Ryzhkov</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[разработка ПО]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2010/09/01/2003906/</guid>
		<description><![CDATA[Мой сегодняшний рассказ о программной ошибке, для исправления которой понадобились два символа и пять дней работы.]]></description>
			<content:encoded><![CDATA[<p>В этом блоге нередко можно почитать о том, как тот или иной программный инструмент, или технология разработки программ помогает делать меньше ошибок, быстрее их находить, легче исправлять. Все это конечно справедливо, но до сих пор нельзя отказываться от самого главного инструмента - мозга, так как заменить его не может ничто. Мой сегодняшний рассказ о программной ошибке, для исправления которой понадобились два символа и пять дней работы.</p>
<p>Однажды после выпуска новой версии статического анализатора кода <a href="http://www.viva64.com/ru/pvs-studio">PVS-Studio</a>, к нам обратился пользователь, жалующийся на то, что наш инструмент не работает на его сложном проекте. Кстати хороший способ для разработчиков оценить полезность программы - если после очередного релиза вам приходит несколько писем с сообщением что что-то не работает и сломалось, то значит ваша программа нужна. Вернемся к программе. Итак, не работает - это значит не находит файлы для анализа. Сначала были вопросы про тип проекта, про установленные дополнительные плагины к Visual Studio. Выяснилось, что у пользователя установлен компилятор Intel C++ Compiler, но дело не в нем. Также у пользователя была установлена CUDA, но и это оказалось не причем. Кстати, проверка простенького демонстрационного проекта работала, хотя проверка вновь созданной пустой болванки проекта - уже не работала.</p>
<p>Попросили пользователя прислать эту болванку проекта нам. У нас на наших машинах проверяется. Дело осложнялось тем, что интеграционные тесты, юнит-тесты, тесты пользовательского интерфейса и ряд других тестов на той версии проходили без проблем.</p>
<p>Под конец пятого дня после неоднократного запуска специальной отладочной версии с расставленными printf (ага, это к вопросу о printf vs новомодные крутые инструменты) выяснилось следующее. Наш анализатор для анализа файлов генерирует специальные cmd-скрипы, в которых есть строка вида:</p>
<p>cd e:\projects\mylib</p>
<p>то есть переход в папку проекта. А как раз в этой версии (предыдущая работала у пользователя нормально) мы сильно переписывали механизм генерации этих скриптов. У команды cd есть особенность - она не переходит в папку на другом диске, если не указать опцию "/d". То есть правильно должно быть так:</p>
<p>cd /d e:\projects\mylib</p>
<p>Этот ключ "/d" был в прошлой версии программы, но по ошибке и недосмотру был потерян в новой версии при переписывании. К сожалению, все тесты у нас запускались с того же системного диска, поэтому команда cd без опции "/d" отрабатывала нормально.</p>
<p>Причем для того, чтобы ошибка проявилась надо обязательно открыть проверяемый проект через Visual Studio (File-&gt;Open...). Если же открыть проект, выбрав sln-файл, то ошибка не проявлялась, так как при таком открытии рабочая папка совпадала с папкой, указываемой в команде cd скрипта. Поэтому повторить ошибку не удавалось довольно долго.</p>
<p>Как известно, радость от нахождения сложной ошибки омрачает осознание собственной глупости. Так случилось и в этот раз - просто при переписывании программист забыл про этот ключ.</p>
<p>Какие можно выводы сделать из этой истории? Банальные, но начинающим программистам от этого они менее полезными не станут:</p>
<ol type="1">
<li>Если ваша программа не работает у пользователя, то не стоит винить установленные у него на компьютере программы типа CUDA или Intel C++ Compiler. Хотя и они бывают <a href="http://www.viva64.com/blog/ru/2010/02/13/840/">виноваты</a>.</li>
<li>Даже если у вас приложение проходит пять разных типов тестов, то это не значит, что оно работает всегда и везде.</li>
<li>Никакой программный инструмент не сможет полностью заменить человеческий мозг. Увы.</li>
<li>Если пользователи вашей программы сами программисты, то вам повезло! Ну какие еще пользователи знают слова отладочная версия, дамп и прочее?</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/09/01/2003906/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ключ /Wp64 и ошибка с обработкой шаблонов</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/02/09/wp64/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/02/09/wp64/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 08:11:14 +0000</pubDate>
		<dc:creator>Evgeniy Ryzhkov</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[/Wp64]]></category>
		<category><![CDATA[64 бита]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[PVS-Studio]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2010/02/09/wp64/</guid>
		<description><![CDATA[В Visual Studio 2008 ключ /Wp64 считается устаревшим, поскольку надо уже давно компилировать 64-битные приложения, а не готовиться к этому.]]></description>
			<content:encoded><![CDATA[<p>Занимаясь продвижением анализатора Viva64 (из состава PVS-Studio) мы часто комментируем ключ <a href="http://www.viva64.com/terminology/Wp64_rus.html">/Wp64</a> из Microsoft Visual C++. Кто не в курсе, напомню, что этот ключ появился в Visual Studio 2003 и предназначался для подготовки миграции приложений на 64-битные системы. В Visual Studio 2008 ключ /Wp64 считается устаревшим, поскольку надо уже давно компилировать 64-битные приложения, а не готовиться к этому. То есть компиляция в 64-битном режиме выявляет все те же самые ошибки и недостатки кода, что выявлял ключ /Wp64 при сборке 32-битного приложения. Причем при компиляции 64-битного кода это делается гораздо более полно и точно.</p>
<p>Но помимо сказанного, у ключа /Wp64 есть еще один недостаток, который путает программистов, которые не знакомы с ним. Это касается проблемы разбора кода, содержащего некоторые шаблоны. Рассмотрим пример.</p>
<p>На просторах интернета, можно <a href="http://www.viva64.com/go.php?url=283">найти</a> в комментариях к блогу разработчиков Visual C++ следующий пример:</p>
<pre name="code" class="cpp">vector&lt;size_t&gt; vs; // создаем вектор элементов size_t
vector&lt;unsigned int&gt; vi; // создаем вектор элементов unsigned int
size_t s; // есть переменная типа size_t
unsigned int i; // есть переменная типа unsigned int
vs[0] = s; // не должно быть warning
vs[0] = i; // не должно быть warning
vi[0] = s; // должно быть warning (*0)
vi[0] = i; // не должно быть warning
s = vs[0]; // не должно быть warning
i = vs[0]; // должно быть warning (*1)
s = vi[0]; // не должно быть warning
i = vi[0]; // не должно быть warning (*2)</pre>
<p>Обращаю внимание, что в 32-битном режиме типы size_t и unsigned int должны совпадать.</p>
<p>Теперь скомпилируем этот код в 32-битном режиме в Visual C++ 2005 и получим следующие сообщения. В строке отмеченной (*1) как и должно:</p>
<p>warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data</p>
<p>Но в строке (*2) выдается также:</p>
<p>warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data</p>
<p>Хотя никакого сообщения здесь быть не должно.</p>
<p>И при этом в строке (*0) "забыто" сообщение.</p>
<p>Если же скомпилировать код в 64-битном режиме, то на строки, отмеченные как (*0) и (*1) как и должно выдается сообщение:</p>
<p>warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data</p>
<p>Автор примера Stephan T. Lavavej говорит о проблемах с реализацией  ключа в /Wp64 в шаблонах. Дело в том, что технически ключ компилятора /Wp64 реализуется через специальное ключевое слово <a href="http://www.viva64.com/terminology/w64_rus.html">__w64</a>, добавляемое к описанию типа:</p>
<pre name="code" class="cpp">#ifdef _WIN64
  typedef __int64 MySSizet;
#else
  typedef int __w64 MySSizet; // Add __w64 keyword
#endif</pre>
<p>Однако это ключевое слово не вводит нового типа данных, поэтому шаблонные классы vs и vi из этого кода одинаковы:</p>
<pre name="code" class="cpp">typedef __w64 unsigned int   size_t;
vector&lt;__w64 unsigned int&gt; vs;
vector&lt;unsigned int&gt; vi;</pre>
<p>И хотя вроде бы vs и vi имеют разный тип, компилятор считает их не без оснований одинаковыми и выдает неправильную диагностику.</p>
<p>Что делать? В Microsoft Connect заведена <a href="http://www.viva64.com/go.php?url=284">ошибка</a>, но как там написано, править ее не будут. Во-первых, не понятно как, а, во-вторых, это актуально только для ключа /Wp64, который объявлен deprecated и будет удален.</p>
<p>Разрабатываемый нами анализатор Viva64 (входящий в состав <a href="http://www.viva64.com/ru/pvs-studio/">PVS-Studio</a>), хотя тоже не идеален при работе с шаблонами, в данном случае успешно выдает предупреждения для данного кода, но основываясь на других правилах. В частности, если не отключено предупреждение V101, то он выдает предупреждение при попытке неявного расширения unsigned до типа size_t, что может также скрывать ошибку. Таким образом, анализатор Viva64 выдаст следующее:</p>
<pre name="code" class="cpp">std::vector&lt;size_t&gt; vs;
std::vector&lt;unsigned int&gt; vi;
size_t s;
unsigned int i;
vs[0] = s;
vs[0] = i; //V101: Implicit assignment
           //type conversion to memsize type.
vi[0] = s; //V103: Implicit type conversion
           //from memsize to 32-bit type.
vi[0] = i;
s = vs[0];
i = vs[0]; //V103: Implicit type conversion
           //from memsize to 32-bit type.
s = vi[0]; //V101: Implicit assignment
           //type conversion to memsize type.
i = vi[0];</pre>
<p>При этом  анализатор в ряде случаев может понять, что некие присваивания безопасны и сократить число ложных предупреждений. Рассмотрим пример:</p>
<pre name="code" class="cpp">std::vector&lt;unsigned int&gt; vi;
for (size_t i = 0; i &lt; 10; i++)
  vi[i] = i;</pre>
<p>Здесь компилятор выдает предупреждение:</p>
<p>warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data</p>
<p>Анализатор Viva64 в свою очередь учитывает, что значение переменной "i" лежит в диапазоне [0..10] и данный код не может привести к ошибке. В результате никакие диагностические сообщения не выдаются.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/02/09/wp64/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Один из ответов на вопрос &quot;Кому вообще нужна вся эта параллельность?&quot;</title>
		<link>http://software.intel.com/ru-ru/blogs/2010/01/13/2002881/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2010/01/13/2002881/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 11:14:28 +0000</pubDate>
		<dc:creator>Evgeniy Ryzhkov</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[инструменты разработки]]></category>
		<category><![CDATA[Многоядерность]]></category>
		<category><![CDATA[параллельные приложения]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2010/01/13/2002881/</guid>
		<description><![CDATA[Не буду призывать "любить" параллельность, а просто расскажу о том, как параллельные приложения помогают разработчикам программного обеспечения.]]></description>
			<content:encoded><![CDATA[<p>В сети очень часто можно встретить рассуждения, что многоядерные процессоры, да и вообще параллельность никому не нужна, и все это проделки одной (двух, трех) компании, которой надо продавать новые процессоры.</p>
<p>Не буду призывать всех "любить" параллельность, а просто расскажу о том, как параллельные приложения помогают разработчикам программного обеспечения.</p>
<p>Когда многоядерные процессоры только начинали появляться, средства разработки программ в основном не поддерживали новые возможности по распараллеливанию. Речь идет не о распараллеливании программ, которые делает программист, а о самих средствах разработки.</p>
<p>Компилятор работал как последовательное приложение, файл за файлом компилируя пользовательскую программу. Анализатор кода файл за файлом обрабатывал исходный код, пытаясь найти в нем ошибки. Система сборки (make) выполняла одну задачу за другой.</p>
<p>К счастью для простых программистов, создатели систем разработки очень быстро увидели, как параллельность поможет пользователям их систем.</p>
<p>В систему сборки make добавилась команда "-j" (или "-jobs"), которая позволяет <a href="http://www.cs.utah.edu/dept/old/texinfo/make/make_toc.html#SEC45">параллельно</a> выполнять команды.</p>
<p>В среду разработки Microsoft Visual Studio 2005 была добавлена возможность сначала компилировать проекты <a href="http://msdn.microsoft.com/en-us/library/9h3z1a69.aspx">параллельно</a>, а потом, в версию 2008,  уже отдельно и файлы(<a href="http://msdn.microsoft.com/en-us/library/bb385193.aspx">опция /MP</a>). Или вот, к примеру, пользователи Microsoft Visual C++ 2005 помнят, сколько копий было сломано, когда в этой версии появился модуль IntelliSense.  <a href="http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/376d8d52-471a-4d8e-a7ef-f0f06959896d/">Топик</a> про то, как отключить IntelliSence имеет 120 000 просмотров в форуме MSDN. Все потому, что на однопроцессорной машине эта технология работала не лучшим образом и довольно серьезно тормозила работу. Но с появлением многоядерных машин, все эти дискуссии угасли. Крутится себе IntelliSence на одном ядре, никому не мешает.</p>
<p>И если раньше для ускорения компиляции приходилось использовать всякие сторонние инструменты вроде <a href="http://todobits.es/mpcl.html">MPCL</a> или <a href="http://www.xoreax.com/">IncrediBuild</a>, то теперь это встроено в средства разработки.</p>
<p>Наш анализатор кода <a href="http://www.viva64.com/ru/pvs-studio">PVS-Studio</a> полностью поддерживает работу на многоядерных машинах. Это значит, что при работе на машине с восемью ядрами анализ будет происходить на всех ядрах. Параллельность в анализаторе реализована за счет параллельной обработки нескольких файлов. При этом программист всегда может в настройках анализатора задать используемое количество ядер. Например, на машине с восемью ядрами для анализа можно использовать только шесть из них, а с оставшимися двумя ядрами можно совершенно спокойно работать дальше, не дожидаясь завершения работы инструмента.</p>
<p><img class="alignnone" src="http://www.viva64.com/blog/ru/wp-content/uploads/2009/12/task-manager.png" alt="" width="500" height="243" /></p>
<p class="wp-caption-text">Например, этот рисунок загруженной машины с восемью ядрами как раз делался при запущенном анализаторе PVS-Studio.</p>
<p>В общем, большинство программистов всячески приветствовали появление поддержки параллельности в средствах разработки. Почему большинство, а не все? Потому что с появлением параллельной компиляции большого проекта теперь чай приходится пить значительно быстрее, чем раньше <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2010/01/13/2002881/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Много ядер хорошо, а быстрый жесткий диск тоже хорошо</title>
		<link>http://software.intel.com/ru-ru/blogs/2009/12/30/2002886/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2009/12/30/2002886/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 13:06:36 +0000</pubDate>
		<dc:creator>Evgeniy Ryzhkov</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2009/12/30/2002886/</guid>
		<description><![CDATA[Какое отношение имеет жесткий диск к анализатору кода? Самое прямое. В процессе работы анализатора создаются препроцессированные файлы всех исходных кодов, и анализатор работает уже с ними.]]></description>
			<content:encoded><![CDATA[<p>Занимаясь разработкой анализатора кода PVS-Studio, мы большое внимание уделяем повышению производительности инструмента. Подобные решения работают достаточно медленно, поэтому программисту даже на мощной машине приходится иногда скучать, ожидая завершения анализа. Анализатор PVS-Studio использует возможности многоядерных процессоров, что позволяет повысить скорость анализа проекта в несколько раз по сравнению с одноядерными системами. Тем не менее, оказалось, что дисковая подсистема также может оказывать существенно влияние на скорость выполнения анализа.</p>
<p>У нас есть база регрессионных тестов из примерно 30 приложений (более 90 проектов) - это исходные коды, которые проверяются анализатором PVS-Studio в автоматическом режиме. Проверка всех этих кодов в версии анализатора для Visual Studio 2008 занимает около двух часов. Используемая машина: процессор с двумя ядрами, четыре гигабайта оперативной памяти и SATA RAID-система (RAID 0). В той же машине еще установлен старый IDE жесткий диск, который никак не использовался, но вынуть из машины его все не было повода.</p>
<p>Однажды по некоторой причине тесты были перенесены с SATA RAID на IDE диск. А после этого переноса мы долго думали, почему тесты стали выполнятся вместо двух часов - четыре! Дело в том, что этот момент совпал с серьезными правками в продукте, и, казалось, что эти правки и приводят к такому сильному падению производительности. Однако вскоре мы вспомнили о смене жесткого диска, и проблема решилась сама собой.</p>
<p>Какое отношение имеет жесткий диск к <a href="http://www.viva64.com/terminology/Static_code_analysis_rus.html">статическому анализатору кода</a>? Самое прямое. В процессе работы анализатора создаются препроцессированные файлы всех исходных кодов, и анализатор работает уже с ними. Мы посчитали объем препроцессированных файлов в наших тестах в версии для Visual Studio 2008. Он оказался около 7 гигабайт. Естественно запись + чтение такого объема на старом IDE диске вызывает существенное падение производительности.</p>
<p>Вывод прост: при компиляции, а уж тем более при работе с анализаторами кода храните исходные тексты на быстром SATA диске, а еще лучше используйте RAID массив. И работать станет намного приятнее.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2009/12/30/2002886/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

