インテル コンパイラー 1000本ノックプロジェクト 4ページ
ファイルアーカイバ「7-Zip」
7-Zipは7z形式やZIP、GZIP、BZIP2、TAR形式の圧縮/展開に対応したWindows向けアーカイバだ。そのほか、ARJやCAB、LZH、RARといったファイルの展開にも対応しており、Windows環境では人気の高いアーカイバツールの1つである。
7-Zipのソースコードは、ダウンロードページから入手できる。記事執筆に使用したのは、2009年2月3日公開の7-Zip 4.65だ。
7-Zipのコンパイル
7-ZipのコンパイルではVisual StudioのIDEを利用せず、コマンドプロンプトからVisual Studio付属のnmake.exeを使用してコンパイルを行う。使用するコンパイラやコンパイルオプションといった設定については、7-Zipのソースコードアーカイブ(7z465.tar.bz2)を展開すると作成される「CPP」ディレクトリ内にある「Build.mak」に記述されている。このファイルを編集する、もしくはこのファイル内で参照されている「CPP」および「CFLAGS」環境変数を設定することでコンパイルオプション等を変更できる。
たとえばコンパイラとしてインテル コンパイラーを使用する場合、次のようにCPP環境変数に「icl」を設定すれば良い。
> set CPP=icl
また、コンパイルオプションについては同様にCFLAGS環境変数を設定する。
> set CFLAGS=<設定するコンパイルオプション>
なお、デフォルトの設定ではコンパイルするモジュールによって、最適化オプションとして「/O1」(コードサイズの最小化)と「/O2」(実行速度の最適化)を使い分けるようになっている。これらも変更したい場合は、Build.mkファイル中で「CFLAGS_O1」および「CFLAGS_O2」の設定を行っている下記の個所にある「-O1」および「-O2」を書き換えれば良い。
CFLAGS_O1 = $(CFLAGS) -O1 CFLAGS_O2 = $(CFLAGS) -O2
以上のように環境変数およびBuild.mkファイルを設定後、「CPP\7zip」ディレクトリ内でnmake.exeを実行するとコンパイルが行われる。
なお筆者が試したところ、コンパイルの際にCPP\7zip\UI\FileManager\Panel.hの459行目でコンパイルエラーが発生した。これは、該当の行を次のようにコメントアウトすることで回避できる。
// CDisableTimerProcessing& operator=(const CDisableTimerProcessing &) {; }
また、7-Zipのデフォルトコンパイル設定では、警告をエラーとして扱うようになっている。そのため、デフォルトで発生する「セキュアでないCランタイム関数を使用している」という旨の警告がコンパイルエラーとして扱われてしまう。この警告については、コンパイルオプションとして「/D_CRT_SECURE_NO_WARNINGS」オプションを付けることで抑制できる。
> set CFLAGS=/D_CRT_SECURE_NO_WARNINGS
コンパイルが完了すると、CPP\7zip\Bundles\ディレクトリおよびCPP\7zip\UI\ディレクトリ以下にEXEファイルおよびDLLファイルが作成される。ここで出力されたEXEファイルおよびDLLファイルには、使用するDLLに関する情報(マニフェスト)が含まれていないため、そのままでは実行時にエラーが発生する。マニフェストをEXEファイルおよびDLLファイルに埋め込むには、各EXEファイル/DLLファイルが生成されているディレクトリで次のように実行すれば良い。
> mt.exe /manifest <EXEファイル名もしくはDLLファイル名>.manifest -outputresource:<EXEファイル名もしくはDLLファイル名>
パフォーマンス検証
コンパイルオプションについては変更せず、単純に使用するコンパイラのみを変更してパフォーマンスの違いを測定した。測定条件は下記の4つである。
- 大きなファイル(ZIP):約660MBのISOイメージファイルをZIP形式で圧縮
- 大きなファイル(7z):約660MBのISOイメージファイルを7z形式で圧縮
- 多数のファイル(ZIP):1648個のファイル(合計約22MB)をZIP形式で圧縮
- 多数のファイル(7z):1648個のファイル(合計約22MB)を7z形式で圧縮
測定結果は次の表9のようになった。7-Zipでは最適化オプションとして「/O1」が多用されていることもあり、単純にインテル コンパイラーを使用するだけでは明確なフォーマンス向上は見られないようだ。使用するコンパイルオプションをもう少し吟味する必要があると思われる。
条件 | コンパイラ | かかった時間 |
---|---|---|
大きなファイル(ZIP) | インテル コンパイラー | 10.14秒 |
Visual C++ | 10.88秒 | |
大きなファイル(7z) | インテル コンパイラー | 38.135秒 |
Visual C++ | 37.882秒 | |
多数のファイル(ZIP) | インテル コンパイラー | 2.787秒 |
Visual C++ | 2.761秒 | |
多数のファイル(7z) | インテル コンパイラー | 6.958秒 |
Visual C++ | 6.796秒 |
波形編集ツール「Audacity」
「Audacity」はオープンソースで開発されている波形編集ソフトで、Windows/Mac OS X/Linuxで動作する。
Windows環境でのコンパイルについては別途wxWidgetsライブラリが必要であり、若干手順が複雑である。ただし、基本的にはAudacity公式Webサイトにある解説、およびソースコード中の「Win」フォルダ内にある「compile.txt」の指示に従えば良い。また、Audacityのダウンロードページ内で配布されているソースアーカイブには一部の依存ライブラリのソースコードが含まれていないため、そちらではなくCVSを用いてソースコードを入手する点に注意してほしい。
CVSで取得したソースコード中にはVisual Studioのプロジェクトファイルが含まれているので、インテル コンパイラーでコンパイルするにはこれをVisual Studioで開き、LAMEの場合と同様にIDEからインテル コンパイラーを用いるように設定すれば良い。