緑のコードを作成する方法

モバイルプラットフォームに適用した場合のエネルギー効率とは何ですか? 簡単に言えば、これはより少ないエネルギーを消費しながら、より多くのことを行う機会です。



各ユーザーは、スマートフォン、ネットブック、ウルトラブックなど、モバイルデバイスの充電を可能な限り少なくしたいと考えています。 おそらくいつか、デバイスを購入して使用してから退屈するか、または道徳的に陳腐化するまで、デバイスを一度だけ充電する必要があるときが来るでしょう。





モバイルプラットフォームの拡大モデルを検討する場合、3つの主要部分で構成されます。



バッテリー



モバイルデバイスのエネルギー貯蔵です。 電池メーカーは毎年、容量を増やし、フル充電の時間を短縮しようとしています。





それはエネルギーの主要な直接消費者です。 ここでも、進歩は止まりません。 「鉄」のメーカーは、消費電力1ワットあたりのパフォーマンスを高めるエネルギー効率の高いチップを作成し、未使用の鉄をオフにして低電力モードに変換できるさまざまな電力モードを追加して、バッテリーを節約しています。



ソフトウェア



それはエネルギーの間接消費者です。 直接ソフトウェアは何も消費せず、鉄にエネルギーを消費させます。 ここにも、バッテリー寿命を延ばす独自の方法があります。 この記事では、ソフトウェアのエネルギー効率の問題についてお話したいと思います。



ソフトウェアはどのくらい正確にエネルギー消費に影響しますか? 一言で言えば-彼は鉄が「眠る」ことを許可しません。



システム内の最大のエネルギー消費者の1つであるプロセッサを検討してください。



プロセッサは、いわゆるC-Stateを使用して電力消費を制御できます。 これらのモードに慣れていない人のために、ここにクイックリファレンスがあります。



C0-プロセッサの動作状態は、さまざまなP状態に分割されます。

C1-プロセッサーは何もせず、動作を開始する準備ができている状態ですが、少し遅れます 多くのプロセッサには、この状態のさまざまなバリエーションがあります。

C2C1とほぼ同じですが、この状態では、プロセッサーの消費電力が少なく、動作状態への移行の遅延が長くなります。

C3- 「スリープ」状態。この状態に移行すると、プロセッサーは第2レベルのキャッシュをクリアします。 消費電力が少なく、稼働状態への移行時間が長いという特徴があります。



...プロセッサによって異なります。



それをより明確にするために、私は実例を挙げます。











最もエネルギー効率の高いオプション-プロセッサは常にスリープします。 そのため、エネルギー消費の観点から最も効果的なプログラムは、実行されておらず、「起動しない」プログラムです。 アクションは生成されず、通常は何も消費しません。 しかし、誰もそのようなソフトウェアを必要としないので、プログラムは何か有用なことをすべきです。 妥協ソリューションとは、何もしてはいけないときに何もしないプログラム(必要な場合にのみ「ウェイクアップする」)であり、何かを行う場合は、できるだけ早くそれを行います。



これは、バックグラウンドでアクションを実行するプログラムに特に当てはまります。 これらのプログラムは常に、イベントが発生した場合にのみスリープおよびウェイクアップする必要があります。



イベントルールまたはイベント駆動型アプローチ



「間違った」コードの例を挙げましょう(残念ながら、コードを書くためのこのアプローチは、あなたが思っているよりもずっと頻繁に使用されています)。 このコード例は、一部のサーバーアプリケーションなどのソケットからデータを受信するために使用されます。



while(true) { //   result = recv(serverSocket, buffer, bufferLen, 0); //    if(result != 0) { HandleData(buffer); } //     Sleep(1000); }
      
      





ここで「間違っている」とは何ですか? データがある場合とない場合、コードは1000ミリ秒ごとにプロセッサを「起動」します。 コードの動作は、シュレックのロバに似ています。 あなたは今ここにいますか? あなたは今ここにいますか?」



このタスクの「正しい」コードはだれにも尋ねず、眠りに落ちて、目を覚ますと待機します。 このため、多くのオペレーティングシステムには、イベントなどの同期オブジェクトがあります。 そうは言っても、コードは次のようになります(コードは不完全で、エラー処理と戻りコードは省略されています。私のタスクは単に原理を説明することです)。



 WSANETWORKEVENTS NetworkEvents; WSAEVENT wsaSocketEvent; wsaSocketEvent = WSACreateEvent(); WSAEventSelect(serverSocket, wsaSocketEvent, FD_READ|FD_CLOSE); while(true) { //      -      WaitForSingleObject(wsaSocketEvent, INFINITE); //  ? WSAEnumNetworkEvents(m_hServerSocket, wsaSocketEvent, &NetworkEvents); //    if(NetworkEvents.lNetworkEvents & FD_READ) { // ,  WSARecvFrom(serverSocket, &buffer, ...); } }
      
      







上記の例の美しさは何ですか? 彼は何の関係もないときに眠ります。



タイマー、コードのアラーム



タイマーなしではできないこともあります。オーディオ、ビデオ、アニメーションの再生など、多くの例があります。



タイマーについて少し。 Windowsシステムのタイマー間隔は、デフォルトでは15.6ミリ秒です。 これはプログラムにとって何を意味しますか? アプリケーションで上記の40ミリ秒ごとにアクションを実行するとします。 15.6ミリ秒の最初の間隔は少なすぎ、2番目の間隔は31.1を通過し、3番目の46.8を早く通過します。ヒットすると、タイマーが機能します。 ほとんどの場合、余分な6.8ミリ秒は重要ではありません。



Sleep(1)を15.6ミリ秒の設定間隔で呼び出すと、コードが1ミリ秒だけスリープしますが、すべて15.6ミリ秒スリープします。



しかし、ビデオの再生に関しては、この動作は受け入れられません。 これらの場合、開発者は、Windows Multimedia API-timeBeginPeriodから関数を呼び出すことにより、システムタイマーの解像度を変更できます。 この機能により、タイマー期間を最大1msに変更できます。 コードの場合、これは良いことですが、バッテリー寿命を大幅に短縮します(最大25%)。

妥協点を見つけるには? 本当に必要な場合にのみ、システムタイマーの期間を変更するだけです。 たとえば、アニメーションを使用するアプリケーションを開発していて、タイマーの解像度を低くする必要がある場合は、アニメーションが表示されて発生するときにタイマーを変更し、ウィンドウが最小化されているかアニメーションが停止している場合に戻ります。



ユーザーの観点からは、 Powercfgユーティリティがバッテリー寿命を延ばす方法を理解するのに興味深い場合があります。 これにより、システムタイマーの期間、システムタイマーの期間の値、ハードウェアを低電力モードにできないドライバーの問題などに関する情報が変更されたアプリケーションを見つけることができます。



タイマーの関連付け



Windows 7にはタイマーを組み合わせる絶好の機会があります。 それが何であり、どのように機能するかを以下の図に示します。











つまり Windowsは、アプリケーションタイマーを「調整」して、オペレーティングシステム自体のタイマー操作と一致するようにします。



この機能を使用するには、呼び出す必要があります



 BOOL WINAPI SetWaitableTimerEx( __in HANDLE hTimer, __in const LARGE_INTEGER *lpDueTime, __in LONG lPeriod, __in_opt PTIMERAPCROUTINE pfnCompletionRoutine, __in_opt LPVOID lpArgToCompletionRoutine, __in_opt PREASON_CONTEXT WakeContext, __in ULONG TolerableDelay );
      
      







MSDNで関数の完全な説明を見つけることができます。 この記事では、特定の間隔からの最大許容偏差を決定するTolerableDelayパラメーターのみに関心があります。



Windowsのタイマーの詳細については、「 タイマー、タイマーの解決、効率的なコードの開発」を参照してください。

早くやる



プログラムのエネルギー効率を高めるもう1つの方法は、できるだけ早く正しいことを行う方法を教えることです。 これは、たとえば、SSE、AVX、およびプラットフォームの他のハードウェア機能を使用してコードを最適化することにより実現できます。 例として、Sandy BridgeのQuick Syncを使用して、ビデオをエンコードおよびデコードします。 Tom's Hardwareで結果を確認できます。



プログラムを最適化したと仮定しますが、現在のエネルギー効率はどのくらいですか? 非常にシンプル-特別なプログラムとツールを使用します。



エネルギー効率分析ツール



1. Intel Power Checker 。 おそらく、プログラムのエネルギー効率を評価する最も簡単で最速の方法です。











プログラムの概要と説明は、 ISNブログにあります。



2. Intelバッテリー寿命アナライザー











バッテリー寿命に影響を与える鉄やソフトウェアのさまざまなアクティビティを追跡するために、より複雑であると同時に有益なツールが使用されます。



3. Microsoft ジュールメーター











また、プラットフォームのさまざまなコンポーネントのエネルギー消費を決定する非常に興味深いツールです。 WattsUp電力計と連動して機能します。



詳細情報の入手先





Intel Power Efficiency Communityの記事、ハウツー、およびエネルギー効率の高いソフトウェアを作成するためのヒント。



バッテリー寿命とエネルギー効率に関するマイクロソフトの記事とレシピ集



タイマー、タイマーの解決、および効率的なコードの開発のリンクは、記事を最後から読み始める人のために既に上で与えられています。



質問がある場合は、コメントで質問してください。 また、明日12月15日午前11時に開催されるウェビナーで「グリーン」ソフトウェアの開発に関する質問をすることもできます。



All Articles