携帯電話やコンピューターのバッテリーが間違った時間に置かれているとき、私たちの誰もそれを好みません。 最近、MSDNサブスクライバーがダウンロードできるようになった新しいバージョンのWindows 7によって、エネルギー効率の高いアプリケーションを作成できるようになることは周知の事実です。 この記事により、Windows開発者は、モバイルデバイスの稼働時間を延ばすのに役立つ新しい便利な方法、手法、およびツールを学ぶことができます。
消費電力
まず、最新のコンピューティングプロセッサの開発動向を見てみましょう。 Microsoft Researchラボの研究者は、最新のプロセッサの多くのパラメーター(トランジスタの数、電力、パフォーマンスなど)を分析しました。 プロセッサの電力消費に特に注意が払われました。 以下は、過去20年間のIntelプロセッサの概要です。
ご覧のとおり、Microsoft Researchによると、プロセッサが消費するエネルギー量は急速に増加しています。 プロセッサIntel 80386SXは、ほとんどエネルギーを消費しませんが、パフォーマンスも高くありません。 高性能の最近のトッププロセッサ、Core 2 Extreme QX6700などを見ると、これらのプロセッサが消費するエネルギー量(約100W)が明らかになります。 この傾向は、最新のプロセッサだけでなく、最新のコンピューターの他の多くのコンポーネント(GPU、イーサネットなど)でも見られ、深刻な問題になります。
問題をさらに詳しく調べると、高エネルギー消費の理由は、コンポーネント(CPU、GPU、イーサネット)とオペレーティングシステムだけでなく、追加のソフトウェアでもあります。 Windows 7開発チームは、コンピューターのバッテリー寿命とOEMソフトウェアのクリーンインストールおよびプレインストールを比較しました。
さまざまな値がありますが、ほとんどの場合、クリーンインストールを行うと、コンピューターをより長い時間バッテリーで実行できます。 ここから、開発したアプリケーションがデバイスの消費電力に大きな影響を与えていると結論付けることができます。 エネルギー効率の高いアプリケーションは、ラップトップなどのモバイルデバイスの動作時間を増やし、サーバーステーションの場合のエネルギーコストを削減します。
エネルギー効率の高いソリューションの分野での開発
エネルギー消費は急速に増加しており、それがこの方向への積極的な発展を引き起こしています。 その1つが「1日のバッテリー」コンセプトで、6.9時間以上のモバイルデバイスを使用できます。 したがって、今日はモバイルデバイスのバッテリ寿命を延ばすために使用できる機会について話している。 多くのOEMは、エネルギー効率の高いデバイスの分野で開発しています。 モバイルデバイスだけでなく、デスクトップとサーバーステーションのソリューションを最適化する傾向を観察できます。 企業は、オフィスやデータセンターのエネルギー消費を削減したいと考えています。 今日は、まさにそのようなエネルギー効率の良いアプリケーションを開発する方法と、これらのアプリケーションを改善するのに役立つソリューションの診断ツールについてお話ししたかったのです。
エネルギー効率の高いアプリケーション開発スキーム
1)高電力消費の理由を理解する
2)リソース使用量の削減
3)シンプルに注意する
4)ソフトウェアをシステム環境に適合させる
5)適切なツールとテクノロジーを使用する
6)アプリケーションでOSの状態の変更(再起動、シャットダウン、スリープなど)に注意してください
7)診断ツールを使用して確認する
8)すべてをもう一度繰り返します(ステップ2に戻ります)
シンプルに注意してください
モバイルデバイスのバッテリ寿命について話すとき、仕事の種類に注意を払うことが重要です。 DVDを2時間見ますか? 2時間の事務作業または2時間のダウンタイム? いずれの場合も、デバイスは異なる量のエネルギーを消費します。 しかし、重要なことは、それらすべてがダウンタイムに関連しているということです。 アイドルモードでは、プロセッサは少量のエネルギーを消費します。 したがって、主なタスクは、ベースレイヤーのエネルギー消費の最大の削減である「シンプル」です。
一部の操作の実行頻度を減らすか、描画するグラフィックを少なくすることで、エネルギー消費を削減できます。 良い例は、Windows Vistaの配色です。 「省電力」モードに切り替えると、Windowsは配色をより単純な(透明ではない)ものに変更し、コンピューターの動作を少し長くします。 別の例は、チームがWindows 7でDVD再生を最適化する方法です。再生速度は60fpsから30fpsに低下しました。 ユーザーにとって、この変更は目立ちませんが、システムの消費量がどれほど少なくなるか想像してください。
エネルギー消費を削減するもう1つの方法は、コードの最適化です。これにより、各段階でバッテリーの寿命を延ばすことができます。 これらの手法はすべて、プロセッサモードで消費されるエネルギー量を削減するツールです。
エネルギー消費を削減するためのもう1つの秘trickは、できるだけ早くジョブを実行し、それにより可能な最大時間アイドル状態になる方法です。 つまり できるだけ頻繁にアイドル状態になるようにします。 エネルギー消費のレベルを上げて、できるだけ早くタスクを完了し、アイドル状態に戻すほうが、より有益な場合があります。 好例は、Windowsのプロセッサ電源管理マネージャです。これは非常にドキドキします。
最適化手法
現代のモバイルプロセッサを見ると、消費電力のダイナミックレンジが広いことがわかります。 アイドルモードでは実質的に何も消費しませんが、最大パフォーマンスでは大量のエネルギーを消費します。 したがって、シンプルに集中することが非常に重要です!
CPU使用率
プログラムで投票を除外し、イベントを使用してください! OSのVista以降のバージョンには、デバイスの電源状態を監視できるイベントに基づいて構築された特別なAPI(RegisterPowerSettingNotification)があります(以下のコードを参照)。 この例では、.NET Framework用のWindows APIコードパックを使用しています。 動作するアプリケーションの例は、投稿の最後にあるリンクからダウンロードできます。
パブリック部分クラスWindow1:Window
{
パブリックWindow1()
{
InitializeComponent();
PowerManager.PowerSourceChanged + = new EventHandler(PowerManager_PowerSourceChanged);
}
private void PowerManager_PowerSourceChanged(オブジェクト送信者、EventArgs e)
{
lab1.Content = PowerManager.PowerSource;
}
}
プログラムでの調査がまだ必要な場合は、できる限り少なくしてください。 新しいCoalescing APIを使用することをお勧めします。これにより、ダウンタイムを増やすことができます。
チームがWindows 7を開発していたとき、多くのシステムプロセスが周期的であるという事実に注目しました。 良い例は、プロセッサの電圧を変更し、それによって処理能力を調整するCPU Power Managerです。 前の状態に関するデータに基づいてプロセッサ電圧を変更し、このために定期的なポーリングを使用します。
繰り返しになりますが、最新のプロセッサは、アイドルモードで非常に少ない電力を消費します。 そして、私たちの主なタスクは、プロセッサをできるだけ長くこの状態に保つことです。 プロセッサがモードを変更するために追加のエネルギーを消費するという事実に注意を喚起したいと思います。 そのため、アイドルモードでの保存よりも切り替えに多くのエネルギーを費やす可能性があります。 この点で、可能な限りアイドル状態にする必要があります。
Windowsタイマー結合API
Coalescing APIのアイデアは、繰り返しのアクティビティを結合することです。 以下のグラフは、システム内のアクティビティの例を示しています(非現実的なデータ)。 ご覧のとおり、グラフでは、Windowsは15.6 ms +ごとに実行される定期的なタイマーによって制御されています。 私たちのシステムでは、タイマーイベントが定期的に発生し、これらのイベントが多数あり、それらは時間軸に沿ってランダムに散らばっています。 新しいAPIを使用すると、それらをグループ化して、可能な限り長い時間アイドル状態を提供できます。
ユーザーレベル関数SetWaitableTimerExを使用して、アプリケーションおよびサービスにこの機能を適用できます。 ただし、イベントの使用をお勧めします。 定期的なタイマーを拒否できない場合は、「Windowsタイマー合体API」が最も効率的にこれを行うのに役立ちます。
SetWaitableTimerEx関数のプロトタイプ:
ブール
WINAPI
SetWaitableTimerEx(
__HANDLE hTimer、
__in const LARGE_INTEGER * lpDueTime、
__LONG LPeriodでは、
__in_opt PTIMERAPCROUTINE pfnCompletionRoutine、
__in_opt LPVOID lpArgToCompletionRoutine、
__in_opt PREASON_CONTEXT WakeContext、
__in ULONG TolerableDelay
);
SetWaitableTimerEx関数は 、 SetWaitableTimer関数と非常によく似ています。これは、タイマーの有効期限を決定するために使用されます。 多くの場合、 SetWaitableTimer関数をSetWaitableTimerExに置き換えるだけです 。 SetWaitableTimerExには、WakeContextとTolerableDelayの2つの新しいパラメーターがあります。 WakeContextパラメーターは、システムをスリープ状態からウェイクできるタイマーを設定する場合にのみ使用してください。 TolerableDelayパラメーターは、指定された時間間隔(ms)からの許容偏差を決定します。
TolerableDelayパラメーターには、少なくとも32ミリ秒(2プラットフォームタイマー割り込み間隔)の値を使用する必要があります。 最適には、間隔の値とともに許容値が増加する場合。 たとえば、中断の間隔が1秒の場合、適切な偏差値は50ミリ秒になります。 ただし、期間の長さが30秒の場合、偏差値は少なくとも1,000ミリ秒である必要があります。
SetWaitableTimerEx関数の要件テーブル。
ヘッダー | Winbase.h |
図書館 | Kernel32.lib |
DLL | Kernel32.dll |
対応OS | Windows 7またはWindows Server 2008 R2以降 |
練習用
「Windows Timer Coalescing API」を使用して、アプリケーションとデバイスドライバーの電力消費を最適化する必要があります。 ただし、グループ化アクティビティはリソースの賢明な使用を置き換えることはできません。 まず、アプリケーションの定期的なアクティビティを制限し、イベントモデルを使用してみてください。
「Windows Timer Coalescing API」を使用する場合は、次のことに注意してください。
・中断間の期間は保証されません。 ただし、エラー(TolerableDelay)を考慮して常に実行されます。
・少なくとも32ミリ秒のTolerableDelayパラメーター値を使用します。これは、15.6ミリ秒ごとに発生する2つのプラットフォームタイマー割り込みに対応しています。
・50、100、250、500 msなど、TolerableDelayパラメーターの値として50の倍数を使用します。
[DllImport( "kernel32.dll")]
static extern bool SetWaitableTimerEx(IntPtr hTimer、[In] ref long ft、int lPeriod、TimerCompleteDelegate pfnCompletionRoutine、IntPtr pArgToCompletionRoutine、bool fResume、REASON_CONTEXT wakeContext、ulongrableD;
このテクノロジーを使用した例は、投稿の最後にダウンロードできます。
ハードドライブ
最新のハードドライブは総消費電力の約8%を消費するため、システム内のすべてのディスクアクティビティに注意を払うことが非常に重要です。 グラフからわかるように、最もリソースを消費するのは読み取りおよび書き込み操作です。これを達成するには、ディスクをスピンアップし、多くのエネルギーを消費する必要があります。 ハードディスクは本当に必要な場合にのみ使用し、定期的なディスクアクティビティをすべて除外してください。
状態変化
Windows 7では、開発チームがコンピューターの状態を保存できるだけの新しいAPIを作成しました(スリープ状態にならずに何時間でもビデオを再生できるMedia Centerの例。どのアプリケーションと現在の状態を保存または変更する理由を報告します。
///コンテキストを作成します
var powerRequestContext = new POWER_REQUEST_CONTEXT();
powerRequestContext.Version = POWER_REQUEST_CONTEXT_VERSION;
powerRequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING;
powerRequestContext.SimpleReasonString = "アプリはジョブを実行しています";
///リクエストを作成する
IntPtr powerRequest = PowerCreateRequest(ref powerRequestContext);
///リクエストを設定します
PowerSetRequest(powerRequest、PowerRequestType.PowerRequestSystemRequired);
///仕事をする
Console.WriteLine( "任意のキーを押す");
Console.ReadLine();
///リクエストをクリア
PowerClearRequest(powerRequest、PowerRequestType.PowerRequestSystemRequired);
診断ツール
Windows 7開発チームには、新しいバージョンのOSでアプリケーションを診断するための新しいツールが含まれています。 これらのPowerCFGユーティリティの1つ。コンソールから呼び出すことができ、エネルギー消費の現在の状態に関する小さなレポートを取得できます。
結果のHTMLを見てみましょう。
このドキュメントは、システム内のプロセスに関する最適化のための簡単な情報と推奨事項を提供します。
より詳細な分析を行うには、 Windows Performance Tools Kit(XPerf)を使用する必要があります。これにより、すべてのパラメーターとプロセスに関するあらゆるデータを取得できます。
まとめ
最新のソフトウェアは、電力消費に大きな影響を及ぼします。 できるだけ長くアイドル状態にすると、かなりの量のエネルギーを節約できます。 この短い記事が、消費電力の観点からアプリケーションを最適化するためのテクニックと方法をよりよく理解するのに役立つことを願っています。
サンプルをダウンロードする