<?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; Mikhail Goncharov</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/mikhail-goncharov/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/21/2005828/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/21/2005828/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 12:41:40 +0000</pubDate>
		<dc:creator>Mikhail Goncharov</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Конкурсы и мероприятия]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[профайлер]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/21/2005828/</guid>
		<description><![CDATA[Может ли "очевидная" оптимизация кода привести к не столь очевидному падению производительности? Как я убедился на собственном опыте - да! Разбираемся с примером.]]></description>
			<content:encoded><![CDATA[<p>Привет всем и прежде всего участникам конкурса <a href="http://software.intel.com/ru-ru/articles/contest-acceler8-2011-main/">Acceler8</a>!</p>
<p>Может ли "очевидная" оптимизация кода привести к падению производительности? Как я убедился на собственном опыте - да!</p>
<p>Вот фрагмент программы которая ищет максимальную подматрицу методом Кадане:</p>
<pre name="code" class="cpp">for (int x = 1; x &lt; w; x++) {
  int v = row_y2[x] - row_y[x];
  if (local_sum &gt; 0) local_sum += v;
  else local_sum = v;
  if (local_sum &lt;= best_sum) continue;
  best_sum = local_sum;
  best_x2 = x;
  best_y1 = y;
  best_y2 = y + span;
}</pre>
<p>"В коде обновления лучшей суммы явно есть лишние действия" подумал я. И переписал так:</p>
<pre name="code" class="cpp">int _x = -1;
for (int x = 1; x &lt; w; x++) {
  int v = row_y2[x] - row_y[x];
  if (local_sum &gt; 0) local_sum += v;
  else local_sum = v;
  if (local_sum &lt;= best_sum) continue;
  best_sum = local_sum;
  _x = x;
}

if (_x != -1) {
  best_x2 = _x;
  best_y1 = y;
  best_y2 = y + span;
}</pre>
<p>Однако скорость работы внезапно упала на 30%. В чем дело? Смотрим на профиль исходного кода:</p>
<p><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/11-18-2011-3-52-24-PM1.png" alt="" width="501" height="259" class="alignnone size-full wp-image-2005854" /></p>
<p>И на профиль полученного:</p>
<p><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/11-18-2011-3-54-19-PM.png" alt="" width="514" height="221" class="alignnone size-full wp-image-2005853" /></p>
<p>Вот оно в чем дело! Компилятор решает, что ветка кода обновления лучшей суммы стала насколько дешевой, что ее можно рассчитывать на каждой итерации цикла.</p>
<p>С этого момента я стал делать только одну оптимизацию за раз и постоянно проверять, что она реально приносит пользу.</p>
<p>Удачи!</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/21/2005828/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

