10/19/2020

最も電力を使わないプログラミング言語は?

The New Stackより

デビッド・カッセル

エネルギー使用量のデータは、プログラミング言語の品質について何か教えてくれるのでしょうか?

昨年、ポルトガルの3つの異なる大学の6人の研究者からなるチームがこの問題を調査し、最終的に「プログラミング言語全体のエネルギー効率」と題する論文を発表しました。彼らは、27の異なる言語で書かれた10のプログラミング問題の解答を実行し、それぞれがどれだけ電力を使用しているか、速度やメモリ使用量と同様に注意深く測定しました。

具体的には、コンピュータ言語ベンチマーク・ゲームの10の問題を使用しました。これは、パフォーマンスを比較するためのフリーソフトウェア・プロジェクトであり、単純なアルゴリズムの問題の標準セットと、テストを実行するためのフレームワークが含まれています。(以前は「The Great Computer Language Shootout」と呼ばれていました。)「これにより、コンパイル/実行オプション、コンパイラ・バージョンとともに、比較可能で代表的な広範なプログラムのセットを入手できました。」

最終的には、実行するテストによって結果が異なるため、様々なベンチマーク・テストを実行することが重要でした。例えば、全体的にはC言語は最も高速であり、最もエネルギー効率が高いことが分かりました。しかし、DNAデータベースをスキャンして、特定の遺伝子配列を探すベンチマークテストでは、Rustが最もエネルギー効率が高く、C言語は3番目でした。

しかし、同じテストの中でも、「最良の」言語は何を基準にしているかによって異なります。そのテストでは、C言語は2番目に速い言語であることが判明しました(ここでも、Rustに次ぐものです)。しかし、メモリ使用量でソートした場合、Rustは完全に9つ順位を下げてしまいました。また、Fortranはこのテストで2番目にエネルギー効率の高い言語でしたが、結果を実行時間で並べ替えると、6つ順位を完全に下げてしまいました。

研究者らは、コンパイラのバージョンと最適化フラグに関するCLBGプロジェクトのガイドラインに「厳密に従った」と述べています。消費電力の測定には、インテルのツールである移動平均電力制限ツールを使用し、各プログラムは1回だけでなく、10回実行しました。「コールドスタートとキャッシュ効果の影響を減らし、測定値を分析できるようにするため」 一貫性を保ち、外れ値を回避します。」(このため、「測定結果は非常に一貫している」と報告されています。) 一貫性を高めるために、すべてのテストは、16GB RAMと3.20GHz Haswell Intel Core i5-4460 CPUを搭載したLinux Ubuntu Server 16.10(カーネルバージョン4.8.0-22-generic)を実行しているデスクトップ上で行われました。

論文の中で、研究者らはいくつかの興味深い結果を指摘しています。

「LispはC言語に比べて平均で2.27倍のエネルギー(131.34J)を消費しますが、実行時間はPascalに比べて2.44倍の実行時間(4926.99ms)、必要なメモリは1.92倍(126.64Mb)です。」

彼らはまた、コンパイル型言語とインタープリタ型言語の結果も比較しました(仮想マシン上で実行される言語については別のカテゴリがあります)。また、この論文には、関数型プログラミングと命令型プログラミングの両方に加えて、オブジェクト指向プログラミングとスクリプトを含む、様々なプログラミング・パラダイムの比較も含まれています。

速い方が環境に優しいのか?

この論文では、高速なプログラムは常により少ないエネルギーを使用するという一般的な仮定を厳しく検討し、E(エネルギー) = T(時間) x P(電力)と言う物理学の法則のように単純ではないことを指摘しています。これは、電力が一定の割合で消費されていないことが原因の一つであ理、プログラムの実行時間がエネルギー消費に影響を与えるかどうかを調査している他の研究者の研究に影響を与えるかどうかを調査している他の研究者の研究に影響をあたている可能性があることを示唆しています。(「この問題に関する結論は時々異なる…」) ベンチマークテストの1つでは、Pascalで記述された同等のプログラムより、Chapelプログラムの方が実行にかかる時間は55%も短くなりましたが、Pascalのプログラムの方が10%もエネルギーを消費しませんでした。

プログラムを高速に実行すればエネルギー消費量が減少するという一般的な考えがまだ存在しますが、研究者たちは「言語が高速であることが必ずしも最もエネルギー効率が良いとは限らない」と明確に述べています。

消費電力は多くの要因(コンパイラの品質や使用されているライブラリなど)に影響されるため、答えを出すのは難しい問題です。しかし、最終的には、研究者は、CPUとDRAMのどちらが消費しているかに基づいてエネルギー消費量を分類することもできました。つまり、ベンチマークプログラムがコンパイルされているか、インタープリタされているか、仮想マシン上で実行されているかに関わらず、平均して大部分(約88%)の電力がCPUによって消費されていると結論付けました。

興味深いことに、インタープリタ型言語では、CPUが消費する電力が92.90パーセントもあれば、81.57パーセントもない場合もあり、わずかに高い変動が見られました。

結果研究を調べた結果、研究者たちはまた、DRAMのピーク使用量とエネルギー消費量の関係は、「ほとんど存在しない」と結論付けています。

この研究は、「速い方が環境に優しいのか」という長年の疑問について、より多くの洞察を提供しています。確かに「最もエネルギー効率の高い言語のトップ5は、実行時間で並べ替えた場合、エネルギーと時間の両方の値に非常に小さい差がある場合でも、その順位を維持しています。」

実際、10のベンチマーク問題のうち9つの問題で、(速度とエネルギー効率の両方で) トップスコアを獲得したのは、全体的に最も速く、最もエネルギー効率の高い言語の上位3つのうちの1つでしたが、これは研究者たちを驚かせるものではありませんでした。 「これらの上位3つの言語(C、C+、Rust)は、データが示すように、実行性能が大幅に最適化され、効率的であることが知られています。」

しかし、他の24言語を実行時間でランク付けしても、エネルギー効率でランク付けした時と同じ順序にはなりません。「4つの言語(OCaml、Haskel、Racket、Python)だけが同じエネルギーと時間のランクを維持しており、残りの言語は完全にシャッフルされています。」

また、個別のベンチマークテストでも、パフォーマンスの速い言語が最もエネルギー効率が良くない場合があります。

コンパイル型言語の長所

他にも興味深い結果がありました。コンパイル型言語は、最もエネルギー効率が高く、実行速度が速い「傾向にあります」。彼らの論文では、その違いを数値で定量化することもできます。「平均して、コンパイル型言語は問題解決の実行に120J [ジュール]を消費しましたが、仮想マシンとインタープリタ型言語では、この値はそれぞれ576Jと2365Jでした。」

研究者らは、実行時間を比較する際にも同じ精度を適用し、平均して「コンパイル型言語は5103ミリ秒、仮想マシン型言語は20623ミリ秒、インタープリタ型言語は87614ミリ秒かかった」と結論付けています。

両カテゴリーの上位5つの言語のうち、4つの言語がコンパイル型でした。 (例外?はJavaです。)

エネルギー消費 実行時間
C言語 57J 2019 ms
Rust 59J 2103 ms
C++ 77J 3155 ms
Ada 98J 3740 ms
Java 114J 3821 ms

最も遅い5つの言語、Lua、Python、Perl、Ruby、Typescriptは、すべてインタープリタ型言語でした。また、最もエネルギーを消費した5つの言語、Perl、Python、Ruby、JRuby、Luaもインタープリタ型言語でした。

しかし同時に、正規表現で文字列を操作する場合、最もエネルギー効率の高い5つの言語のうち3つは、インタープリタ型言語(TypeScript、JavaScript、PHP)であることが分かりました。「しかし、他のシナリオではエネルギー効率があまり高くない傾向があります。」

コンパイル型言語は、使用されるメモリ容量が最も少ない言語の上位5つにランクインしました。

言語 必要なメモリ容量
Pascal 66Mb
Go 69Mb
C言語 77Mb
Fortran 82Mb
C++ 88Mb

「平均して、コンパイル型言語は125Mb、仮想マシン型言語は285Mb、インタープリタ型言語は426Mbが必要でした。」と研究者は報告しています。一方、インタープリタ型言語は、5つの最下位のうち4つを占めています。つまり、JRuby、Dart、Lua、Perlが最も多くのメモリ容量を消費していました。(Erlangはインタープリタ型言語ではありませんが、DartとLuaの間の下位5つに入ります)。

「プログラミング・パラダイムで並べ替えると、命令型言語は116Mb、オブジェクト指向は249Mb、関数型は251Mb、最後にスクリプトは421Mb必要でした。」

実際、様々なパラダイムを比較すると、多くの場合、命令型プログラミングがトップに立っています。また、そのベンチマーク・プログラムは、オブジェクト指向、関数型、スクリプトの各パラダイムのベンチマーク・プログラムよりも、平均的なエネルギー消費量がはるかに少なく、高速に動作していました。

エネルギー消費 実行時間
命令型 125J 5585ms
オブジェクト指向 879J 32965ms
関数型 1367J 42740ms
スクリプト 2320J 88322 ms

しかし、考慮すべき要素はたくさんあります。「異なるプログラミング・パラダイムや、同じパラダイム内の言語であっても、エネルギー消費、時間、メモリに与える影響が全く異なることは明らかです。」と研究者たちは書いています。しかし、それらのうちどれが最も重要なのかは、あなたのシナリオによって異なります。(例えば、バックグラウンド・タスクは必ずしも最速のランタイムを必要とするわけではありません。)

また、アプリケーションによっては、エネルギー使用量と実行時間という2つの要素を考慮する必要があります。その場合、「単一の目的の両方で優位に立っているため、C言語が最適な解決策です。」と研究者は書いています。メモリ使用量を減らしながら、時間を節約しようとしている場合、C、Pascal、Goは「同等」です。3つの変数(時間、エネルギー使用量、メモリ使用量)をすべてを見ている場合も同じことが言えます。しかし、メモリの使用量を減らしながらエネルギーを節約しようとしているのであれば、CかPascalを選択するのが最適です。

論文の最後に、研究者たちは、さらなる研究のために、長期的な総メモリ使用量と消費エネルギーとの相関性を調べたいと付け加えています。

彼らはオンラインでデータを共有しており、将来の研究者が、例えば.NET言語やJVM言語などを比較しやすくなることを示唆しています。モバイル・アプリケーション、モノのインターネットシステム、または限られた電源で動作するその他のアプリを扱う開発者にとって、消費電力が大きな懸念事項です。

しかし、結局のところ、この研究はプログラマが最も嫌いなもの、つまり曖昧さを残すことになるかも知れません。研究者は、単一の最高のプログラミング言語を探しているのであれば、「この質問には具体的で究極的な答えがない」と報告しています。

「各ベンチマークで最もエネルギー効率の高い言語は、ほぼ常に最速の言語ですが、他の言語よりも一貫して優れている言語は存在しないというのが事実です。」と研究者たちは結論付けています。「ある言語が使用される状況は、その言語が最もエネルギー効率の高い選択肢であるかどうかを判断するための中心的な側面です。」

Hacker News