==== HTMLのレンダリングパフォーマンスを比較する ====
それでは、インテル コンパイラーでコンパイルしたFirefoxのパフォーマンスを調べてみよう。Webブラウザのパフォーマンスを測る方法には色々あるが、まずはHTMLの解析とレンダリング速度を測る「[http://scragz.com/archived/mozilla/test-rendering-time Test rendering time]」テストを試してみた。このテストは、ランダムな数値を含む5000行の表を含むHTMLをレンダリングするのに必要な時間を測定するものだ。今回はネットワークなどの条件による結果の変動を防ぐため、このHTMLファイルをローカルHDDに保存し、さらにHTMLファイルの末尾に記述されている下記の無関係な!JavaScriptコードを削除したうえで実行させた。
{{{
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-365950-1");
pageTracker._trackPageview();
</script>
}}}
なお、テストを行う際は一度Firefoxでこのファイルを開いた後、F5キーでリロードを5回行ってその平均を結果とした。また、テストで使用したPCのスペックは'''表2'''のとおりで、Firefoxのコンパイルはインテル コンパイラーおよびVisual C++ 2008の両方ともにデフォルト設定で行った。
{{{ html
<h6>表2 テストで使用したPCのスペック</h6>
<table class="wikitable" border="1">
<tr><th>構成要素</th><th>スペック</th></tr>
<tr><td>CPU</td><td>Core 2 Duo E6550(2.33GHz)</td></tr>
<tr><td>OS</td><td>Debian GNU/Linux 5.0</td></tr>
<tr><td>メモリ</td><td>2GB</td></tr>
</table>
}}}
テスト結果は'''図1'''のようになり、インテル コンパイラーでコンパイルしたFirefoxのほうが、Visual C++でコンパイルしたものよりも1割以上高速、という結果となった。
[[Thumb(045f4c95ecc3d712b59ad1efc2d52ba0.png, caption=図1 Test rendering timeの実行結果)]]
==== Sunpiderによるベンチマーク ====
続いて、最近話題になっている!JavaScriptエンジンのベンチマークツール「[http://www2.webkit.org/perf/sunspider-0.9/sunspider.html SunSpider JavaScript Benchmark]」(以下、!SunSpider)を使用してパフォーマンスを比較してみた。!SunSpiderは!JavaScriptエンジンの性能を調べるベンチマークテストで、3D表示や変数へのアクセス、ビット操作など、!JavaScriptの実行に関わるパフォーマンスを測定するテストで構成されている。実行結果はそれぞれのテストを実行するのにかかった時間で表示され、この数値が小さいほどパフォーマンスが高い。
さて、'''表3'''が!SunSpiderのテスト結果である。!SunSpiderは比較的結果にばらつきが出やすいため比較が難しいが、インテル コンパイラー版バイナリは「math」では大幅に高いパフォーマンスを示したほか、「regexp」や「string」などでも良好な結果を示している。
{{{ html
<h6>表3 SunSpiderの実行結果</h6>
<table class="wikitable" border="1">
<tr><th colspan="2">テスト項目</th><th>インテル コンパイラー 11.0</th><th>Visual C++ 2008</th></tr>
<tr><td colspan="2">Total</td><td>1589.2</td><td>1641.6</td></tr>
<tr><td rowspan="4">3d</td><td>Total</td><td>167.6</td><td>167.6</td></tr>
<tr><td>cube</td><td>54.8</td><td>52.2</td></tr>
<tr><td>morph</td><td>29.4</td><td>34</td></tr>
<tr><td>raytrace</td><td>83.4</td><td>81.4</td></tr>
<tr><td rowspan="5">access</td><td>Total</td><td>159.4</td><td>145.2</td></tr>
<tr><td>binary-trees</td><td>45.2</td><td>41</td></tr>
<tr><td>fannkuch</td><td>70.2</td><td>59.8</td></tr>
<tr><td>nbody</td><td>29.6</td><td>29.6</td></tr>
<tr><td>nsieve</td><td>14.4</td><td>14.8</td></tr>
<tr><td rowspan="5">bitops</td><td>Total</td><td>56.2</td><td>57</td></tr>
<tr><td>3bit-bits-in-byte</td><td>1.8</td><td>1.6</td></tr>
<tr><td>bits-in-byte</td><td>8.8</td><td>20.2</td></tr>
<tr><td>bitwise-and</td><td>18</td><td>11.2</td></tr>
<tr><td>nsieve-bits</td><td>27.6</td><td>24</td></tr>
<tr><td>controlflow</td><td>recursive</td><td>41</td><td>37.6</td></tr>
<tr><td rowspan="4">crypto</td><td>Total</td><td>59.2</td><td>60.6</td></tr>
<tr><td>aes</td><td>37.6</td><td>38</td></tr>
<tr><td>md5</td><td>14.8</td><td>15.6</td></tr>
<tr><td>sha1</td><td>6.8</td><td>7</td></tr>
<tr><td rowspan="3">date</td><td>Total</td><td>234.4</td><td>232</td></tr>
<tr><td>format-tofte</td><td>129.2</td><td>131.2</td></tr>
<tr><td>format-xparb</td><td>105.2</td><td>100.8</td></tr>
<tr><td rowspan="4">math</td><td>Total</td><td>43.2</td><td>65.2</td></tr>
<tr><td>cordic</td><td>22.8</td><td>37.8</td></tr>
<tr><td>partial-sums</td><td>12</td><td>18.8</td></tr>
<tr><td>spectral-norm</td><td>8.4</td><td>8.6</td></tr>
<tr><td>regexp</td><td>dna</td><td>252.8</td><td>265.8</td></tr>
<tr><td rowspan="6">string</td><td>Total</td><td>575.4</td><td>610.6</td></tr>
<tr><td>base64</td><td>25</td><td>29</td></tr>
<tr><td>fasta</td><td>76.8</td><td>87.4</td></tr>
<tr><td>tagcloud</td><td>143.4</td><td>147</td></tr>
<tr><td>unpack-code</td><td>210.2</td><td>201.8</td></tr>
<tr><td>validate-input</td><td>120</td><td>145.4</td></tr>
</table>
}}}
※単位はミリ秒
以上のように、インテル コンパイラーによる高速化はFirefoxでも有効であることが確認できた。今回はデフォルト設定でのコンパイルを行ったが、設定次第ではより高いパフォーマンスが期待できる可能性もある。興味を持たれた読者の方はぜひチューニングに挑戦してみてほしい。
{{{ html
<div class="column">
}}}
==== コラム Linux環境におけるFirefoxのコンパイル ====
Linux環境でのFirefoxのコンパイル手順は、基本的にはWindows環境の場合と同一である。コンパイルにはPerlやmake、pkg-configなどの開発ツールやGTK2、libXt、libIDLなどのライブラリが必要だが、これらはaptやyumといったパッケージシステムで導入できる。そのほかコンパイルに必要なライブラリやツールなどは、[https://developer.mozilla.org/ja/Linux_Build_Prerequisites Linux Build Prerequisites]にまとめられているので、こちらを参照してほしい。
コンパイル環境が整ってしまえば、あとはFirefoxのソースコード一式をダウンロードして展開し、展開されたソースツリー中の「mozilla-central」フォルダ中に「.mozconfig」設定ファイルを作成して「make -f client.mk」を実行と、Windowsでのコンパイルと同様の手順でコンパイルが行える。
なお、使用するコンパイラは.mozconfigファイルではなく、CCおよびCXX環境変数で指定する。たとえばインテル コンパイラーでコンパイルを行う場合、.mozconfigファイルを作成した後に次のようにコンパイルを実行すればよい。
{{{
$ cd icc_mozilla-central
$ export CC=icc
$ export CXX=icpc
$ make -f client.mk
}}}
{{{ html
</div>
}}}
[[PageNavi(NavigationList)]]