グリーンコードと白樺。開発におけるグリーンコードの基本原則





こんにちは。私の名前はスタスです。Domclickでは、Sberbankでの住宅ローン貸付のためのバックオフィスサービスの開発を監督しています。



最近、あらゆる種類のレポートやポッドキャストで、「グリーンコード」という用語に出くわすことがよくあります。インターネットでうわさ話をしてこのトピックを研究した結果、この用語は、このコードが実行される機器の消費電力を削減できるアプリケーションの開発と設計における一連の手法を表すことに気付きました。



多かれ少なかれ、この質問は通常、モバイルアプリケーションの開発者が困惑します。これは主に、コードが実行されるデバイスのバッテリー容量が限られているためです。



話題はかなり「誇大宣伝」になり、「グリーン」の原則がどのようにWEB開発に反映されるのかを理解することにしました。



「グリーンコード」作成の基本原則



このトピックに関する多くのレポートと記事を読んだ後、電力消費に影響を与えるアプリケーション開発の次の側面に焦点を当てます。



1)アルゴリズムの簡素化と最適化



上記のように、コードの実行は最小限のエネルギー消費につながるはずです。最適化されたコードはより高速に実行されるため、処理と機器の冷却コストが少なくて済みます。



コード内の特定の操作を実行するためのエネルギー消費量の差を計算してみましょう。これは、リストの従来の並べ替えです。よりコントラストの違いを示すために、与えられた例の状況を意図的に誇張します。



バブルソートを見てみましょう。これはおそらく最も最適ではない方法の1つです。私たちにとても適しています。リストの並べ替えを計算して、それがMacBookの消費電力にどのように影響したかを見てみましょう。まず、データ配列とバブルソートロジック自体をシミュレートしましょう。



from random import randint



def bubble(array):for i in range(productNumber-1):

        for j in range(productNumber-i-1):

            if array[j] > array[j+1]:

                buff = array[j]

                array[j] = array[j+1]

                array[j+1] = buff



productNumber = 60000

products = []

for i in range(productNumber):

    products.append(randint(1, 1000))



bubble(products)

print(products)


コード実行がエネルギー消費に与える影響を測定するために、iStat Menus 6監視システム(https://bjango.com/mac/istatmenus/)を使用しました。 MacBookをネットワークに接続し、すべてのサードパーティアプリケーションを閉じて、バッテリーを充電するために一定時間待機し、並べ替えを開始



しました。バブル並べ替えを実行したときの







消費電力グラフ: 305秒間続く消費電力の顕著なジャンプを確認できます。これは、最適ではないリクエストの実行が原因でした。さらに、エネルギーは5分(305秒)費やされました



P = (W2 – W1) × 305 = (17,29 [ ] – 2,9 [ ]) × 305 = 14,39 × 305 = 4389 = 0,0012 *



ここで、このコードが誤って工業製品サーバーに到達し(サーバーの追加電力消費量が私のMacBookと同じであり、依存関係が正比例すると仮定します)、10秒ごとに1の頻度で実行され始めたとしましょう。その後、1年でより多くのエネルギーが得られます



365 × 24 × 3600 /10 × 0,0012 * = 3 784,32 *



サーバーをホストしているデータセンターが、白樺の木を燃料として使用するボイラー室から電力を受け取っているとします。 1 m 3の白樺の木を燃やすと、1900 kW * h / m3エネルギーが放出されます。もちろん、ボイラーの効率は100%ではありません。75%とすると、次のようになります 木を通常の円柱とすると、その体積は



(3 784,32 / 1900) / 0,75 = 2,66 3







V = Pi × R2 × H



ここで、Rは木の幹の半径、0.12メートル(平均値)、

Hは木の幹の高さ、3メートル(平均値)とします。



その後、我々が得る: 1立方メートル中に木があるでしょう。この手段を スクリプトを強化するには1年必要です。 比較のために、標準のPythonソート方法(を使用して同じソートを実行しましたPythonで標準の並べ替えを実行するときのエネルギー消費グラフ: 同じ計算ロジックを適用すると(ピーク期間は10秒でした)、次のようになります 。1年で(操作が10秒に1回実行されると仮定) または:



V = 3,14 × 0,0144 × 3 = 0,14 3



1 / 0,14 = 7,14



2,66 3 × 7,14 = 19



.sort()















P = (W2 – W1) × 10 = (3,51 [ ] – 2,9 [ ]) × 10 = 6,1 = 0,0000016 *







365 × 24 × 3600 /10 × 0,0000016 * = 5,05 *







5,05 / 1900 / 0,75 × 7,14 = 0,025 .



もちろん、この例には多くの仮定があり、バブルソートが行われることはめったにありません。しかし、結果の数字は私には興味深いようでした



2)可能な限り、アプリケーションのイベント駆動型モデルを使用します



重要なのは、ほとんどのプロセッサが電力消費の複数の「状態」をサポートしているということです。カーネルが計算でビジーでない場合、オペレーティングシステムはカーネルを「スリープ」状態にします。この状態では、プロセッサの消費電力ははるかに少なくなります。



状態のスペクトル(エネルギー最適化):







これについて詳しくは、こちらをご覧ください



多くの場合、特定のイベントが発生したときに、いくつかのアプリケーションロジックを実行する必要がある状況があります。また、このイベントが発生したことを確認するために、この情報の受信に関心のあるサービスは、このイベントが完了したという事実を格納するサービスを定期的にポーリングすることがよくあります。タイマーによる。さらに、圧倒的多数のリクエストは否定的な回答を受け取ります。つまり、99%のリクエストは実際には必要ありません。



対応するイベントをキューにブロードキャストし、その発生の事実をすべての関係するサービスに読み取るのが正しいでしょう。




状態のスペクトル(エネルギー最適化):





もう1つの例は、フロントエンドとバックエンドのアプリケーションコンポーネントの相互作用です。データベース内のデータに応じてフロントの状態を変更する必要がある場合、リクエストが定期的にバックエンドに送信され、不要な追加の負荷が発生することがあります。ソケットサーバーを介して必要なデータの状態の変化をフロントに通知することは可能ですが。



ソケットも間違えられる可能性がありますが、「悪い」コードの例を次に示します。



while(true)
{
        // Read data
        result = recv(serverSocket, buffer, bufferLen, 0);

        // Handle data  
        if(result != 0)
        {
                HandleData(buffer);
        }

        // Sleep and repeat
        Sleep(1000);
}


ソケットにデータが到着しなくても、コードは1000秒ごとに実行され、貴重なエネルギーを浪費していることがわかります。



同じことを少し異なって書くことができ、より少ないエネルギーが費やされます:



WSANETWORKEVENTS NetworkEvents;
WSAEVENT wsaSocketEvent;
wsaSocketEvent = WSACreateEvent();
WSAEventSelect(serverSocket, 
wsaSocketEvent, FD_READ|FD_CLOSE);
while(true)
{
    // Wait until data will be available in 
    the socket
    WaitForSingleObject(wsaSocketEve
    nt, INFINITE);
    // Read data
    result = recv(serverSocket, buffer, 
    bufferLen, 0);
    // Handle data 
    if(result != 0)
    {
        HandleData(buffer);
    }
} 


3) UI/UX: «»



データがまだ使用されているが、めったにない場合は、デフォルトでは表示せず、[詳細情報を表示]ボタンをクリックするだけで表示することをお勧めします。



この原則を説明する簡単な例:フォームを使用するシナリオに目的のオブジェクトの検索が含まれている場合、データオブジェクト(リクエスト、ユーザー、アウトレット、倉庫、オフィス)のリストを表示します。



悪いインターフェースの例







ページにはタスクの膨大なリスト(「ページ」に分割)が表示されますが、ユーザーは上部の検索バーで特定のクライアントを(頭の中のロジックに従って)検索します。やることリストを取得するためにリソースを浪費するのはなぜですか?



同じシナリオ、異なる方法で実装:



「グリーン」インターフェースの例







クライアント選択ロジックはシステムに移動されました。デフォルトでは、不要なデータは「習慣外」で要求されません。環境保護論者に加えて、このオプションとサイバーセキュリティは激しく称賛されます。



4)リファクタリング



ほとんどの場合、リファクタリングは便利です。しかし、このコンテキストでは、1つの単純な目的で必要です。不要な(ガベージ)コードを破棄するか、既存のコードを単純化して消費電力を削減することです。



3年以上開発されてきた多くのアプリケーションは、以前に実装された(そしておそらくすでにカットされた)関数から残った数百行の未使用または予測できない動作コードを蓄積します。このコードが実行されることもありますが、その作業の結果は主張されません。



定期的な監査とリファクタリングにより、このようなコードの量は減りますが、完全に取り除くことはできないでしょう。



たとえば、サービスの1つを定期的にリファクタリングしているときに(技術的な労働時間の割り当て内で)、次のことがわかりました。



リファクタリングの例







crm_deal_id-古いシステムの住宅ローン取引の識別子。今では必要ありませんが、コードはそれを取得するためにチェックしdelete_deal_chat_telephony、他の多くのアクションを実行する追加の関数呼び出しています。



これらはすべて、機能を失うことなく削除できます。



5)高負荷のアプリケーションには低レベルのプログラミング言語を使用する



明らかに、ほとんどの場合、低レベルの言語で書かれたアプリケーションはよりエネルギー効率が良いです。ロードされたサービスをPythonで(単純な操作を実行する場合)C / C +で書き直すことは理にかなっています。それはより速くそしてより環境に優しいでしょう。



確かに、そのような言語でロジックを作成するために必要な知識がないことがよくあります。



6)グループI / Oオペレーション



プロセッサなどのストレージシステムにも、さまざまな電源状態があります。

スリープモードは、ウォーム動作モードよりもはるかに少ないエネルギーを消費します。これは、ストレージシステム/ハードドライブに特に当てはまります。



アプリケーションがディスクに書き込まれたデータをグループ化し、常にではなく特定の期間にディスクにアクセスできる場合、「アイドル」の期間中にオペレーティングシステムがディスクを「休止状態」に送信するため、これはよりエネルギー効率が高くなります。



7)ログに電力消費の少ないストレージシステムを使用する



「ホット」および「コールド」ストレージを使用することをお勧めします。たとえば、先週のログにアクセスする可能性が非常に高くなるため、「ホット」クッキングのインデックス形式でログを保存することは理にかなっています。より長いログは、より安価で電力消費の少ないストレージシステムに保存できます。



産業規模ではどうですか?



上記では、コードを操作してエネルギー効率を確保するための基本的な手法について説明しました。しかし、これらのルールのほとんどに従うことでさえ、視覚化するのが難しい非常に控えめな節約をもたらします。もちろん、リストがバブル方式でソートされていない場合は



、電子文書管理を実装するための機能を意図的に開発することで、はるかに大きな効果が得られます。



Domclickチームの活動の1つは、住宅ローンを取得するプロセスを最適化および簡素化することです。そして、最終段階のこの住宅ローンのプロセスでは、多くの文書が紙に作成されます。そして、いくつかのコピーで。売り手用に1部、買い手用に1部、銀行ファイル用に1部。



Domclickがこの悪質な慣行を排除し、ドキュメントフロー全体を電子形式に転送するために多大な努力を費やしていることを知ってうれしく思います。今年、住宅ローン取引の大部分はすでに完全にデジタル化されています(1つの紙だけが印刷されました:拡張された暗号化電子署名であるUKEPの発行の申請書)。他のすべての文書はこのUKEPによって署名されており、紙は使われていません。



このイニシアチブにより、すでに67,491,108枚以上の紙が節約されました。白樺には約23,000本の木があります!



環境を保護する!



興味のある方へのリンク:

  1. グリーンIT-ITシステム/ ArditoLでエネルギー消費を削減するための利用可能なデータとガイドライン。Morisio M…-で:持続可能なコンピューティング。-ISSN2210-5379。-スタンパ
  2. Understanding Green Software Development: A conceptual Framework /Luca Ardito, Giuseppe Procaccianti, Marco Torchiano, Antonio Vetro
  3. Green SW Engineering:Ideas for including Energy Efficiency into your Softwar Projects/Gerald Kaefer



All Articles