<?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; Dmitry Rizshkov</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/author/dmitry-rizshkov/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/2012/05/16/2007561/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/#comments</comments>
		<pubDate>Wed, 16 May 2012 13:17:28 +0000</pubDate>
		<dc:creator>Dmitry Rizshkov</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Ultrabook]]></category>
		<category><![CDATA[Ultrabooks]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[sensors]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/</guid>
		<description><![CDATA[На прошедшем недавно Intel Developer Forum 2012 в Пекине компания Intel и ее партнеры продемонстрировали новые ультрабуки, одной из отличительных особенностей которых (не считая дизайна и наличия сенсорного экрана) является наличие сенсоров. Причем, данные модели не просто концептуальный дизайн, они являются образцами реальных устройств, которые начнут появляться на рынке в ближайшее время. С их появлением [...]]]></description>
			<content:encoded><![CDATA[<p>На прошедшем недавно <a href='http://www.intel.com/content/www/us/en/intel-developer-forum-idf/idf-2012.html'>Intel Developer Forum 2012</a> в Пекине компания Intel и ее партнеры продемонстрировали новые ультрабуки, одной из отличительных особенностей которых (не считая дизайна и наличия сенсорного экрана) является наличие сенсоров. </p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6211/30671174.3/0_75353_62e61613_orig' />
</p>
<p>Причем, данные модели не просто концептуальный дизайн, они являются образцами реальных устройств, которые начнут появляться на рынке в ближайшее время. С их появлением и широким распространением сенсоры больше не будут считаться диковинкой, а станут неотъемлемой частью любого ультрабука.</p>
<h2>Виды сенсоров</h2>
<p>Не берусь говорить точно о том, какие именно датчики будут устанавливаться, но скорее всего в стандартный набор будут входить:</p>
<ul>
<li>Датчик освещенности</li>
<li>Акселерометр</li>
<li>Компас</li>
<li>Датчик ориентации</li>
<li>GPS</li>
</ul>
<h2>Зачем они нужны</h2>
<p>Их наличие может дать пользователю возможность использовать навигацию, работать с умными, контекстно-зависимыми приложениями, а также новые возможности по взаимодействию с интерфейсом пользователя, новый класс игр и многое другое.<br />
Для программиста это возможность добавить в свое приложение функции, отличающие программу от продуктов конкурентов, а то и вовсе возможность найти и "застолбить" новую модель использования. Тема пока новая, у каждого разработчика есть шанс создать что-то, что станет "классикой жанра".</p>
<p>Благо предпосылки к созданию программ, работающих с сенсорами, появились еще в Windows 7 -  <a href='http://msdn.microsoft.com/en-us/library/windows/hardware/gg463473.aspx'>Sensor and Location Platform</a>. Это унифицированный интерфейс взаимодействия с сенсорами, который позволяет избежать неразберихи, когда каждый датчик поставлялся со своими драйверами и своим API. </p>
<h2>Как начать использовать сенсоры уже сейчас</h2>
<p>С софтом разобрались, теперь про железо - ультрабуков с сенсорами на борту на рынке пока нет. Что делать, если уже чешутся руки попрактиковаться и создать что-то новое, уникальное?</p>
<p>Существуют два варианта:</p>
<ul>
<li>Использовать сторонний датчик (набор сенсоров), например, от Freescale или STMicroelectronics</li>
<li>Использовать датчики, которые уже есть, практически у каждого - сенсоры смартфона</li>
</ul>
<p>Далее я как раз и хочу рассказать о втором пункте, на примере использования смартфона на базе ОС Android в качестве «донора» данных.</p>
<p>Однажды, в поисках подобного решения я наткнулся на интересное приложение - <a>PCRemote</a>, которое представляет из себя программу для удаленного управления компьютером с помощью устройств, работающих под Android. В сети полно подобных проектов, но этот оказался интересным потому, что предлагал использовать не только сенсорный экран (как множество других проектов) для управления компьютером, но и акселерометр, компас, гироскоп. Причем поддержка сенсоров организована таким образом, что после установки всего необходимого софта в системе появляются реальные "виртуальные" сенсоры. Windows их "видит" как обычные датчики, подключенные (интегрированные) к компьютеру, благодаря этому работа с ними возможна посредством стандартного API из состава <a href='http://msdn.microsoft.com/en-us/library/windows/hardware/gg463473.aspx'>Sensor and Location Platform</a>.</p>
<p>Данное решение поддерживает:</p>
<ul>
<li>GPS</li>
<li>Акселерометр</li>
<li>Датчик ориентации</li>
<li>Датчик освещенности</li>
</ul>
<p>Огромным плюсом использования этого решения является то, что после того как на замену "виртуальным" сенсорам придут "реальные, железные", разработчику не нужно будет ничего менять, т.к. взаимодействие с датчиками останется прежним, на уровне Sensor and Location Platform API.</p>
<h2>Как установить</h2>
<p>Первое, что необходимо сделать, это перейти на страницу <a href='http://feishare.com/android/remotesensors'>RemoteSensors</a> и скачать RemoteSensors driver for Windows 7. На сайте представлены драйвера для 32-х и 64-х систем. Скачиваем, запускаем установку, следуем подсказкам. </p>
<p>После завершения установки идем в панель управления, раздел <i>Hardware and Sound</i>, далее <i>Location and Other Sensors</i>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6304/30671174.3/0_753c3_e4043663_orig' align='center' />
</p>
<p>Ставим галочку (<i>Enabled</i>) напротив PcRemote Sensors Device и нажимаем <i>Apply</i>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6305/30671174.3/0_753c4_73ec38d3_orig' align='center' />
</p>
<p>В системе появились сенсоры. Осталось привязать их показания к показаниям сенсоров смартфона. Для этого скачиваем приложение <a href='http://feishare.com/android/pcremote'>PCRemoteServer</a> и запускаем его.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6211/30671174.3/0_75311_ad77c90b_orig' align='center' />
</p>
<p>Последний шаг - через Google Play скачиваем и устанавливаем приложение <a href='https://play.google.com/store/apps/details?id=org.linknet.pcremote&amp;hl=ru'>PcRemote Advance</a>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6110/30671174.3/0_7535f_a0e76d0d_orig' align='center' />
</p>
<p>Запускаем, выбираем пункт <i>Discovery Server</i>, после того, как сервер обнаружен и произошло подключение - выбираем пункт - <i>Sensors to PC</i>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6302/30671174.3/0_75360_c6e87e9_orig' align='center' />
</p>
<p>Готово! Наш ПК (ноутбук, ультрабук, нетбук) теперь имеет сенсоры!</p>
<p>Как проверить работоспособность данного решения? Для этого я написал простое приложение, которое при запуске инициализирует <a href='http://msdn.microsoft.com/en-us/library/windows/hardware/gg463473.aspx'>Sensor and Location Platform</a>, перечисляет все сенсоры, доступные в системе и выводит их в виде списка (<i>Sensors</i>). При выборе сенсора в списке в нижней части окна (<i>Values</i>) можно видеть текущие показания сенсоров.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6300/30671174.3/0_75362_4249198c_orig' align='center' />
</p>
<p>Если все было сделано правильно, то при запуске приложения вы увидите список как на картинке. </p>
<p>Теперь можно смело приступать к разработке сенсоро-ориентированного приложения для новых мобильных платформ.</p>
<p>Если у вас остались вопросы о том как использовать сенсоры в своих приложениях - приходите послушать доклады, посвященные сенсорам на <a href='http://software.intel.com/ru-ru/articles/intel-at-KRI-2012/'>КРИ</a> и <a href='http://www.msdevcon.ru/'>DevCon 12</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Существующие приложения и будущие Android x86 устройства</title>
		<link>http://software.intel.com/ru-ru/blogs/2012/02/14/android-x86/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/02/14/android-x86/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 07:10:00 +0000</pubDate>
		<dc:creator>Dmitry Rizshkov</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Intel Atom]]></category>
		<category><![CDATA[NDK]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/02/14/android-x86/</guid>
		<description><![CDATA[Вскоре на рынке появятся новые смартфоны и планшеты, работающие на базе x86 архитектуры, о своих планах на выпуск подобных устройств уже заявили компании Lenovo и Motorola. Что принетсет новая платформа разработчикам программного обеспечения? Об этом я и хотел бы поговорить в данной статье. Но сначала немного о планах и серьезности намерений производителей "железа". В этом [...]]]></description>
			<content:encoded><![CDATA[<p>Вскоре на рынке появятся новые смартфоны и планшеты, работающие на базе x86 архитектуры, о своих планах на выпуск подобных устройств уже заявили компании Lenovo и Motorola. Что принетсет новая платформа разработчикам программного обеспечения? Об этом я и хотел бы поговорить в данной статье.</p>
<p>Но сначала немного о планах и серьезности намерений производителей "железа". </p>
<p>В этом году на всемирной выставке CES 2012 компания Intel продемонстрировала первый Android-смартфон работающий на базе x86 архитектуры. Данный смартфон является «атомным», т.к. работает на мобильной платформе Medfield и использует чип Atom Z2460. </p>
<p>Не смотря на то, что по сути этот смартфон является прототипом, он демонстрирует хорошие показатели в тестах на  производительность и энерго-эффективность, практически не уступая топовым моделям смартфонов присутствующим сейчас на рынке.</p>
<p align="center"><img src='http://img-fotki.yandex.ru/get/4607/30671174.2/0_6e551_ae01a052_orig' /> </p>
<p>На верхних графиках результаты тестов на энерго-эффективность при использовании 3G, воспроизведении аудио и видео. Синим отмечены результаты работы смартфона на базе Medfield. В нижней части – результаты тестов на производительность. Как видно из графиков Medfield имеет лучшие показатели во всех тестах.</p>
<p>Прототип-прототипом, но а как же реальные устройства? Там же на CES компания Lenovo показала первый Android-смартфон на базе x86 архитектуры - Lenovo K800. Данный аппарат работает на платформе Medfield, тактовая частота процессора - 1,6 ГГц, имеет 4.5-й дюймовый дисплей и 8-ми мегапиксельную камеру. Продемонстрированная модель работает на базе Android версии 2.3, но производитель обещает, что к моменту выпуска аппарат будет работать на Android 4.0. </p>
<p align="center"><img src='http://img-fotki.yandex.ru/get/2714/30671174.2/0_6e550_17ff458_orig' /></p>
<p>Первые Android-смартфоны К800 от компании Lenovo появятся на рынке во втором квартале 2012 года.</p>
<p>О своих планах по выпуску Android устройств на базе х86-й архитектуры так же заявила компании Motorola, заключившая с компанией Intel многогодичное соглашение о партнерстве. Компания Motorola собирается представить первое устройство на базе Atom так же во втором квартале 2012 года.</p>
<p>Помимо производительности мобильные устройства на базе платформы Medfield будет отличать наличие технологий NFC и WiDi. Если первая технология уже проникает на рынок смартфонов, то вторая является уникальной для устройств на базе Android. </p>
<p>WiDi уже используется в современных ноутбуках и ультрабуках и даст возможность новым смартфонам просматривать изображения, видео, играть в игры на больших экранах, без использования проводов. Например на телевизорах, так же использующих технологию WiDi, либо подключенных к WiDi адаптерам.</p>
<p>Первая волна устройств, судя по озвученным планам, появится уже во втором квартале 2012 года. С точки зрения потребителей это будут новые устройства, обладающие рядом отличительных особенностей таких как производительность, энерго-эффективность, наличие WiDi. С точки зрения разработчика - добавится новая аппаратная платформа, и, в некоторых случая, возникнет необходимость адаптации существующих приложений под новую платформу. </p>
<p>В каких случаях может потребоваться адаптация? Прежде чем ответить на этот вопрос давайте вкратце рассмотрим способы создания приложения для Android. </p>
<p>Все приложения для Android можно условно разделить на два типа - <i>Dalvik</i> приложения и приложения использующие <i>NDK</i></p>
<p>Dalvik это виртуальная машина, являющаяся чатью платформы Android. Dalvik позволяет запускать и исполнять приложения написанные на Java. </p>
<p>NDK это набор инструментов позволяющий создавать и использовать в своем приложении библиотеки написанные на C \ C++. Прибегать к помощи NDK приходится в тех случаях когда есть необходимость, например, использовать готовый С++ код написанный под другую платформу (чтобы не терять готовые наработки), когда необходимо повысить производительность приложения (как бы не был хорош Dalvik но проигрывает "нативному" коду в вопросах производительности).</p>
<p>Если Вы являетесь разработчиком приложение, то для Вас не составит труда определить использует ли приложение NDK библиотеки или нет. Если приложение Вам досталось со стороны, то для того, чтобы определить  - использует ли приложение NDK библиотеки или нет необходимо открыть APK файл (который по сути является ZIP архивом) приложения с помощью любого архиватора (например 7-Zip) и проверить наличие подкаталога <i>lib</i>.</p>
<p align="center"><img src='http://img-fotki.yandex.ru/get/4512/30671174.2/0_6e54e_f1a819a4_orig' /></p>
<p>Если таковой имеется, то название внутренних подкаталогов укажет на наличие NDK библиотек для различных аппаратных платформ.</p>
<p align="center"><img src='http://img-fotki.yandex.ru/get/5000/30671174.2/0_6e54d_d90a1b96_orig' /></p>
<p>Так же можно воспользоваться утилитой <a href='https://market.android.com/details?id=com.intelloware.apkinfo'>APK Info</a>, доступной в Android Market. С помощью данной утилиты можно посмотреть список установленных приложений и получить, в том числе, информацию о наличие NDK библиотек.</p>
<p align="center"><img src='http://img-fotki.yandex.ru/get/5504/30671174.2/0_6e54f_d3d76ca7_orig' /> </p>
<p>Что произойдет с появлением новой платформы? Для Dalvik приложений ничего не изменится, т.к. они работают поверх виртуальной машины, и обеспечение совместимости и работоспособности этой машины на новой аппаратной архитектуре задача разработчиков Dalvik.</p>
<p>Для многих NDK приложений, по сути, тоже ничего не изменится. Не смотря на то, что архитектура будет новой большинство NDK приложений не заметят разницы. Причина - бинарный транслятор, так же анонсированный и продемонстрированный компанией Intel на CES 2010. Смысл работы транслятора простой - он интерпретирует ARM код в x86 код, что обеспечивает совместимость приложений с новой архитектурой. </p>
<p>Транслятор решит проблемы совместимости приложений с х86 и разработчику NDK приложение не придется думать о добавлении поддержки новой аппаратной платформы.С одной стороны. С другой - если разработчик заинтересован в том чтобы "выжать" все, что можно из новой платформы и создать эффективное в плане производительности и энерго-потребления приложение, то ему необходимо будет добавить поддержку новой архитектуры в свое приложение. </p>
<p>К счастью сделать это очень просто. Поддержка x86 платформы появилась в NDK еще в прошлом году с выходом <i>Android NDK 6</i>. </p>
<p>Первое, что необходимо сделать это убедится, что у Вас установлен Android NDK версии 6 или выше. Скачать последнюю версию Android NDK можно на <a href='http://developer.android.com/sdk/ndk/index.html'>официальной странице</a>.</p>
<p>Далее необходимо добавить новый target для сборки в make файл для сборки библиотек. Обычно в этом файле прописано что-то вроде:</p>
<pre name="code" class="cpp">
APP_ABI := armeabi armeabi-v7a
</pre>
<p>К данной строке необходимо добавить <i>x86</i>:</p>
<pre name="code" class="cpp">
APP_ABI := armeabi armeabi-v7a x86
</pre>
<p>В последней, на данный момент, версии <i>Android NDK 7</i> добавился новый параметр – <i>all</i>.</p>
<p>Указав его можно собирать приложение под все поддерживаемые аппаратные платформы:</p>
<pre name="code" class="cpp">
APP_ABI := all
</pre>
<p>После сборки библиотек их необхоимо включить в APK файл и "перезалить" пакет приложения в Android Market.</p>
<p>Разработчику не придется создавать отдельную версию приложения для x86-й платформы. Он может включить библиотеки для x86 в уже существующий установочный пакет и обеспечить, тем самым, совместимость одного пакета со всеми аппаратными платформами. </p>
<p>В панели управления приложениями Android Market так же не придется вносить каких-либо изменений, т.к. Android Market сам позаботится о проверке совместимости приложения и целевой платформы.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/02/14/android-x86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как создавать «зеленый» код</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/12/21/2006501/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/12/21/2006501/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 13:06:37 +0000</pubDate>
		<dc:creator>Dmitry Rizshkov</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Battery Life analyzer]]></category>
		<category><![CDATA[Intel Power Checker]]></category>
		<category><![CDATA[Joulemeter]]></category>
		<category><![CDATA[WattsUp]]></category>
		<category><![CDATA[энергоэффективность]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/12/21/2006501/</guid>
		<description><![CDATA[Что такое энерго-эффективность в применении к мобильным платформам? Простыми словами это возможность сделать больше, затратив при этом меньше энергии. 
<br />
Каждому пользователю хотелось бы как можно реже заряжать свое мобильное устройство, будь то смартфон, нетбук, ультрабук. Возможно, когда-нибудь наступит момент, когда устройство нужно будет зарядить всего один раз, после его покупки и пользоваться до тех пор пока оно не надоест или морально не устареет.]]></description>
			<content:encoded><![CDATA[<p>Что такое энерго-эффективность в применении к мобильным платформам? Простыми словами это возможность сделать больше, затратив при этом меньше энергии.<br />
<br />
Каждому пользователю хотелось бы как можно реже заряжать свое мобильное устройство, будь то смартфон, нетбук, ультрабук. Возможно, когда-нибудь наступит момент, когда устройство нужно будет зарядить всего один раз, после его покупки и пользоваться до тех пор пока оно не надоест или морально не устареет.</p>
<p>Если рассмотреть укрупненую модель любой мобильной платформы то она состоит и 3-х основных частей.</p>
<h2>Аккумулятор</h2>
<p>Является хранилищем энергии мобильного устройства. Производители аккумуляторов каждый год стараются увеличить емкость, уменьшить время полной зарядки.</p>
<h2>Железо</h2>
<p>Является основным прямым потребителем энергии. Тут прогресс тоже не стоит на месте. Производители "железа" создают все более энерго-эффективные чипы, выдающие большую производительность на Ватт потребленной энергии, добавляют различные режимы энергопотребления, позволяющие отключать неиспользуемое железо, переводить в режимы низкого энергопотребления, экономя тем самым батарею.</p>
<h2>Софт</h2>
<p>Является косвенным потребителем энергии. Напрямую софт ничего не потребляет, он вынуждает железо потреблять энергию. Здесь тоже есть свои методики, позволяющие продлить жизнь батареи. О проблеме энерго-эффективности софта я и хотел бы поговорить в данной статье.</p>
<p>Как именно софт влияет на потребление энергии? Если в двух словах - он не дает железу "спать". </p>
<p>Рассмотрим одного из крупных потребителей энергии в системе - процессор.</p>
<p>Процессор может управлять своим энергопотреблением с помощью, так называемых, <i>C-State</i>. Для тех, кто не знаком с этими режимами, привожу короткую справку:</p>
<ul>
<li><i>С0</i> - рабочее состояние процессора, подразделяется на различные P-States.</li>
<li><i>C1</i> - состояние, когда процессор ничего не делает, но готов приступить к работе, правда с небольшой задержкой. Многие процессоры имеют различные вариации этого состояния.</li>
<li><i>С2</i> - почти тоже самое, что и С1, но в этом состоянии процессор потребляет меньше энергии, и имеет большую задержку для перехода в рабочее состояние.</li>
<li><i>С3</i> - состояние "сна", переходя в это состояние процессор очищает кэш второго уровня. Характеризуется меньшим энергопотреблением, и более долгим временем перехода в рабочее состояние.</li>
<li>...и так далее в зависимости от процессора.</li>
</ul>
<p>Для того чтобы было более наглядно приведу иллюстрацию:<br />
<img src='http://img-fotki.yandex.ru/get/5413/30671174.2/0_6a544_18363d69_orig' align='center' /><br />
</p>
<p>Самый энерго-эффективный вариант - процессор всегда спит. Значит самая эффективная, в плане энергозатрат программа, это та программа, которая не запущена и его не "будит". Она не производит никаких действий, и вообще ничего не потребляет. Но такой софт никому не нужен, программа должна делать что-то полезное. Компромисное решение - программа, которая не делает ничего тогда когда не должна ничего делать ("будит" только по нужде), и если делает что-то, то делает это максимально быстро.</p>
<p>Особенно это касается программ, которые выполняют какие-либо действия в фоновом режиме. Эти программы должны спать всегда и просыпаться только при наступлении какого-либо события.</p>
<h2>События рулят или Event-driven подход</h2>
<p>Приведу пример "неправильного" кода (к сожалению, такой подход к написанию кода используется гораздо чаще, чем вы думаете). Данный пример кода служит для получения и данных из сокета, например, в каком-нибудь серверном приложении.<br />
</p>
<pre name="code" class="cpp">
while(true)
{
	// Получаем данные
	result = recv(serverSocket, buffer, bufferLen, 0);

	// Обработка полученных данных
	if(result != 0)
	{
		HandleData(buffer);
	}

	// Спим секунду и повторяем
	Sleep(1000);
}
</pre>
<p>Что же здесь "неправильного"? Есть данные или нет данных, код будет "будить" процессор каждые 1000 мс. Поведение кода напоминает осла из Шрека: "Уже приехали? А теперь приехали? А сейчас приехали?".</p>
<p>"Правильный" код, для данной задачи, не будет ни кого спрашивать, он уснет у будет ждать когда разбудят его. Для этого, во многих операционных системах, существуют объекты синхронизации, такие как события. С учетом сказанного код должен выглядеть так (код не полный, опущена обработка ошибок и кодов возврата, моя задача просто проиллюстрировать принцип):</p>
<pre name="code" class="cpp">
WSANETWORKEVENTS NetworkEvents;
WSAEVENT	 wsaSocketEvent;
wsaSocketEvent = WSACreateEvent();

WSAEventSelect(serverSocket, wsaSocketEvent, FD_READ|FD_CLOSE);

while(true)
{
	// Ждем наступления одного из событий - получения данных или закрытия сокета
	WaitForSingleObject(wsaSocketEvent, INFINITE);

	// Что произошло?
	WSAEnumNetworkEvents(m_hServerSocket, wsaSocketEvent, &amp;NetworkEvents);

	// Пришли новые данные
	if(NetworkEvents.lNetworkEvents &amp; FD_READ)
	{
		// Читаем, обрабатываем
		WSARecvFrom(serverSocket, &amp;buffer, ...);
	}
}
</pre>
<p>В чем прелесть примера выше? Он будет спать тогда, когда ему нечего делать.</p>
<h2>Таймеры, будильники нашего кода</h2>
<p>Иногда без таймеров не обойтись, примеров масса - проигрывание аудио, видео, анимация. </p>
<p>Немного о таймерах. Интервал системного таймера Windows, по умолчанию, равен 15,6 мс. Что это означает для программ? Допустим вы хотите, чтобы выше приложение выполняло какое-то действие каждые 40 мс. Проходит первый интервал в 15,6 мс, слишком мало, проходит второй 31,1, опять рано, третий 46,8 - попали, таймер сработает. В большинстве случаев лишние 6,8 мс не имеют значения. </p>
<p>Так же прямое влияние на <i>Sleep</i>, если вы вызовете Sleep(1), при установленном интервале в 15,6 мс, то спать код будет не 1 мс, а все 15,6 мс.</p>
<p>Но если дело касается проигрывания видео - тогда это поведение не приемлемо. В этих случаях разработчик может изменить дискретность системного таймера вызвав функцию из Windows Multimedia API - timeBeginPeriod. Данная функция позволяет изменить период таймера вплоть до 1мс. Для кода это хорошо, но сильно сокращает жизнь батареи (вплоть до 25%). </p>
<p>Как найти компромисс? Все просто изменяйте период системного таймера только тогда, когда это действительно необходимо. Например, если вы разрабатываете приложение, использующее анимацию и вам нужна меньшая дискретность таймера меняйте таймер тогда, когда анимация отображается и происходит, и возвращайте если, например, окно свернуто или анимация остановлена.</p>
<p>С точки зрения пользователя иногда, чтобы понять как продлить жизнь от батареи будет интересна утилита <a href='http://technet.microsoft.com/ru-ru/library/cc748940(WS.10).aspx'>Powercfg</a>. С ее помощью можно узнать какое-то приложение изменило период системого таймера, значение периода системного таймера, информацию о проблемах драйверов, не позволяющих переводить "железо" в режим низкого энерго потребления и т.д.</p>
<h2>Объединение таймеров</h2>
<p>В Windows 7 появилась замечательная возможность объединять таймеры. Что это такое и как это работает представлено на рисунке ниже:</p>
<p>
<img src='http://img-fotki.yandex.ru/get/4714/30671174.2/0_6a547_a983a801_orig' align='center' /><br />
</p>
<p>Т.е. Windows "подстраивает" таймеры приложений таким образом, чтобы они совпадали со срабатываниями таймера самой операционной системы.</p>
<p></p>
<p>Для того, чтобы использовать эту возможность необходимо вызвать </p>
<p></p>
<blockquote><p>
BOOL WINAPI<br />
SetWaitableTimerEx(<br />
    __in     HANDLE hTimer,<br />
    __in     const LARGE_INTEGER *lpDueTime,<br />
    __in     LONG lPeriod,<br />
    __in_opt PTIMERAPCROUTINE pfnCompletionRoutine,<br />
    __in_opt LPVOID lpArgToCompletionRoutine,<br />
    __in_opt PREASON_CONTEXT WakeContext,<br />
    __in     ULONG TolerableDelay<br />
    );
</p>
</blockquote>
<p></p>
<p>Полное описание функции вы можете найти в <a href='http://msdn.microsoft.com/en-us/library/windows/desktop/dd405521(v=vs.85).aspx'>MSDN</a>. В рамках данной статьи нас интересуют только параметр TolerableDelay, который определяет максимальное допустимое отклюнение от заданного интервала.</p>
<p>Более подробно о таймерах в Windows можно прочитать в статье <a href='http://msdn.microsoft.com/en-us/windows/hardware/gg463266.aspx'>Timers, Timer Resolution, and Development of Efficient Code</a></p>
<h2>Сделай это быстро</h2>
<p>Еще один способ сделать программу более энерго-эффективной это научить ее делать нужные вещи быстро, на сколько это возможно. Добиться этого можно, например, оптимизировав код, путем использования SSE, AVX и других аппаратных возможностей платформы. В качестве примера хочу привести использование Quick Sync в Sandy Bridge для кодирования и декодирования видео. На сайте <a href='http://www.tomshardware.com/reviews/sandy-bridge-core-i7-2600k-core-i5-2500k,2833-5.html'>Tom's Hardware</a> можно посмотреть результаты.</p>
<p>Допустим мы оптимизировали нашу программу, но насколько она теперь более энерго-эффективна, как это оценить? Очень просто - с помощью специальных программ и инструментов.</p>
<h2>Инструменты для анализа энерго-эффективности</h2>
<p>1. <a href='http://software.intel.com/partner/app/software-assessment#ipc'>Intel Power Checker</a>. Пожалуй самый простой и быстрый способ оценить энерго-эффективность своей программы.<br />
<br />
<img src='http://img-fotki.yandex.ru/get/4714/30671174.2/0_6a54a_b771bd21_orig' align='center' /><br />
<br />
Обзор и описание программы можно найти в блоге <a href='http://software.intel.com/ru-ru/blogs/2010/08/11/intel-software-partner/'>ISN</a><br />
<br />
2. <a href='http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&amp;DwnldID=19351'>Intel Battery Life analyzer</a><br />
<br />
<img src='http://img-fotki.yandex.ru/get/5413/30671174.2/0_6a54b_4dd16f47_orig' align='center' /><br />
<br />
Более сложный, но вместе с тем более информативный инструмент, служит для отслеживания различных активностей железа и софта, которые влияют на время работы от батареи.<br />
<br />
3. <a href='http://research.microsoft.com/en-us/projects/joulemeter/default.aspx'>Joulemeter</a> от Microsoft<br />
<br />
<img src='http://img-fotki.yandex.ru/get/5822/30671174.2/0_6a54c_b6fad904_orig' align='center' /><br />
<br />
Тоже достаточно интересный инструмент, определяющий энергопотребление различных компонентов платформы. Может работать в связке с ваттметром <a href='https://www.wattsupmeters.com/secure/products.php?pn=0'>WattsUp</a>.</p>
<h2>Где узнать больше</h2>
<ul>
<li><a href='http://software.intel.com/en-us/articles/energy-efficient-software/'>Intel Power Efficiency Community</a> статьи, практические рекомендацие и советы по созданию энерго-эффективного программного обеспечения.</li>
<li><a href='http://msdn.microsoft.com/en-us/windows/hardware/gg487541'>Battery Life and Energy Efficiency</a> сборник статей и рецептов от Microsoft</li>
<li><a href='http://msdn.microsoft.com/en-us/windows/hardware/gg463266.aspx'>Timers, Timer Resolution, and Development of Efficient Code</a> ссылка уже приведена выше, для тех, кто начинает читать статью с конца.</li>
<li>Так же на данную тему мы провели вебинар, запись которого <a href='http://software.intel.com/ru-ru/videos/webinar-power-efficiency/'>доступна здесь</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/12/21/2006501/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

