2021年末 CPUワットパフォーマンス簡易調査
まえがき
2021年11月4日に、Intelの12世代Coreシリーズが発売された。 これにより、近年はAMDのRyzenシリーズが優位になっていたマルチスレッド性能においても、処理の種類によればCoreシリーズが上回るということで話題になっている。
一方で、12世代Coreシリーズの最上位であるCore i9-12900Kの最大消費電力は基本的に241Wに設定されており、これは対抗のRyzen 9 5950Xシリーズの142Wに比べて100Wほど大きい設定になっている。 このため、発熱も多くなり、「爆熱」や「電力大食いでワットパフォーマンスは悪い」などの評判が出回っている。
しかし、CPUの性能は消費電力の設定値によって変動するものである。 最近のデスクトップ向けCPUは省電力性より性能を優先している。 このため、ワットパフォーマンスが最良の設定に比べてかなり高めの電力設定が行われており、デフォルト設定でのワットパフォーマンスはワットパフォーマンスの評価に適さない。
そこで、この記事では主にCore i9-12900KとRyzen 9 5950Xに注目して、CPUの最大消費電力を制限しつつベンチマークを行うことで、電力設定ごとのベンチマークスコアを比較する。
続きを読むRustのプロジェクトを一括でcleanするツールを作った
Rustのパッケージ管理ツールCargoのプラグインとして、指定ディレクトリ以下の全てのプロジェクトを探して cargo clean
するツール、 cargo-clean-recursive
と作成したという話。
動機
CargoはRustの標準のパッケージ管理ツール兼ビルドツールであり、RubyにおけるRubyGems、JavaScript系言語におけるnpmと同等の機能を提供するツールである。
Cargoでは、依存するクレート(Cargoおけるパッケージ)については共通のディレクトリ ~/.cargo/registry
に、コンパイル後のバイナリや生成したドキュメントについてはプロジェクトのディレクトリ下の target
ディレクトリに保存している。
これは、クレートがソースコードの形態で配布され変化することがない一方で、コンパイル後のバイナリやドキュメントはビルド時のフラグや環境変数によって変化するためである。
したがって、ビルド結果として生成されるファイルは、依存クレートのものを含めプロジェクトごとに管理する必要がある。
そして、このバイナリファイルやドキュメントはファイル数が多く、ディスク容量を消費する。
サンプルとして、自作のAWS S3とCloudFrontへの静的ホームページの同期ツールをビルドしてみると、合計で200の依存クレートが存在した。
デバッグビルド・リリースビルド・ドキュメントを合わせると消費しているディスク容量は2.09 GiB、ファイル数は81496個であった。
ビルド結果のファイルは再生成できるものであり、長期間使わないなら削除しておきたい。
しかし、標準の cargo
のコマンドでは指定ディレクトリ以下の全てのプロジェクトを一括でcleanする方法がないため、サブコマンドとして実装した。
使用法
このツールをインストールするには、 cargo install cargo-clean-recursive
を実行すれば良い。
cargo clean-recursive
を実行すると、カレントディレクトリ以下の全てのプロジェクトを探し、cargo clean
を呼び出す。cargo clean-recursive --release
の場合、cargo clean --release
を呼び出し、リリースビルドの出力のみを削除する。cargo clean-recursive --doc
の場合、cargo clean --doc
を呼び出し、リリースビルドの出力のみを削除する。
同時に --doc
(-d
) と --release
(-r
) を指定することもできる。
この場合、 cargo clean --release
と cargo clean --doc
をそれぞれ呼び出している。
Rustの所有権(ownership)を語義から理解する
所有権(ownership)と借用(borrowing)とライフタイム(lifetime)はRust特有の言語仕様として有名である。
Rustではガベージコレクション(GC)を使用せずにメモリ安全性を確保するために所有権と借用とライフタイムの仕様を採用している。 この機構によって、Rustではプログラマが変数の値が有効である範囲を意識する必要がある代わりに、GCに関する実行時のオーバーヘッドがなくともメモリ安全でありスレッドセーフであるプログラムを記述することができる。
一方で、所有権は「『変数が値の所有権を持っている』というのは結局何のことなのかわからない」という混乱を生む要因でもある。 単純に考えると、変数に値が入っているのだから、変数が値を持っているのは当然のことのように思える。 そうすると、「値の所有権を持つ」とは一体何のことを言っているのかがはっきりとしなくなってしまう。 この混乱や理解の困難さの原因の一つは、原語である英語と日本語の間で所有権(ownership)という単語のニュアンスが違うことである。 この記事では、ownershipの英語の語義から、Rustの所有権という用語が何を表しているのかを説明する。
続きを読むserdeの機能で様々な形態のJSONを列挙型として扱う
JSONはREST API呼び出し、データ保存、多言語との連携などに数多く使用されている。 一方で、JSONは言語でサポートされる表現が整数と浮動小数点数・文字列・配列・オブジェクト・そしてnull程度しかなく、それ以上に複雑な表現はこれらの基本機能を組み合わせて表現することになる。 機能の組み合わせ方には複数の方法があり、特に複数の型の構造体やクラスが混在する時の表現形式は複数ある。
Rustでは、表現したいデータ型が既知であれば、複数の型のうちどれかであることを表現するために列挙型が使える。 そして、Rustのシリアライザ・デシリアライザのライブラリであるserdeを用いて、列挙型とJSONの相互変換をすることができる。
続きを読む新ランチャー・Minecraft 1.6.4で効果音が出ない問題の解決法
発端
MinecraftのPC版(現:Java Edition)のランチャーが新バージョンになったのは結構前のことである。
それよりしばらく後、PCの故障に伴ってOSを再インストールし、マインクラフトの環境も再構築したところ、1.7.10環境では効果音が出るのにもかかわらず、1.6.4環境ではMODで追加される効果音以外が出ないという症状が出る。
このバグはMCL-6280として登録されている。
[MCL-6280] No sound in older versions on native launcher, despite working in the Java launcher - JIRA