40億個の if 文
- 最近ソーシャルメディアを見ていたところ、電車の中でこのスクリーンショットを見つけた。
- このコードは、時間とメモリのトレードオフの完璧な例だ。
- C 言語で実装して性能を高めようとした。
コード構成
- C 言語で偶数と奇数を判定するコードを書いた。
- 最適化を無効にしてコンパイルした。
- 0 から 10 までの数値では正常に動作するが、それ以上の数値では問題が発生した。
メタプログラミング
- Python を使って if 文をメタプログラミングした。
- 8ビット整数について偶数と奇数を判定するプログラムを生成した。
16ビット拡張
- 16ビット整数について同じ方法でプログラムを拡張した。
- 約 130k 行の C ファイルを生成してコンパイルした。
32ビットへの挑戦
- 32ビット整数についてプログラムを拡張しようと試みた。
- 330GB の C ファイルを生成したが、コンパイラがヒープ領域不足で失敗した。
- Portable Executable 形式の制限により、4GB を超えるファイルを処理できなかった。
機械語コードを直接記述
- x86-64 アセンブリ言語で IsEven 関数を直接書いた。
- Python を使って機械語コードを手動でコンパイルした。
実行ファイルの生成
- 40GB のファイルを生成し、すべての 32ビット整数について偶数と奇数を判定した。
- ファイルをメモリマップし、関数ポインタを使ってコードを実行した。
最終バグ修正
strtoul 関数に置き換えて、符号なし整数のパース問題を解決した。
- プログラムは非常に高速で、大きな数値についても 10 秒以内に結果を返す。
GN⁺の見解
- 重要性: この記事は、プログラミングの基本概念である時間とメモリのトレードオフを理解する助けになる。また、最適化されていないコードが実際の性能に与える影響を示す良い事例でもある。
- 興味深さ: プログラミング言語間の性能差やコンパイラの限界を実験的に探る過程が興味深い。特に、Python と C 言語を比較しながら性能向上を目指す試みが面白い。
- 教訓: この記事は、複雑な問題を解決するために、ときには非効率に見えるアプローチが実際には有用であり得ることを示している。また、コンピュータサイエンスにおいて創造的な解決策を模索することの重要性を強調している。
1件のコメント
Hacker Newsの意見
1つ目のコメント要約:
2つ目のコメント要約:
3つ目のコメント要約:
is-evenとis-oddのnpmパッケージについてのジョーク。npm installを使うと40GBのパッケージがダウンロードされるという想像。4つ目のコメント要約:
5つ目のコメント要約:
6つ目のコメント要約:
7つ目のコメント要約:
8つ目のコメント要約:
9つ目のコメント要約:
libdivideライブラリの例とともに、8ビット整数の除算をルックアップテーブルで置き換えた経験を共有。10個目のコメント要約: