「続・ハイパフォーマンスWebサイト」を読んだ

http://www.oreilly.co.jp/books/9784873114460/
PDF版を買って読みました。

※経緯1:PVを増やす対策のひとつとして、知っておいた方が良いと思ったので。
Yahoo!: 0.4秒遅くなると、ページのトラフィックが 5 〜 9 % 落ちます。」
(ref. http://www.slideshare.net/xcgfly2sky/velocity-wpo20101207-stevesouders
「ハイパフォーマンスWebサイト」本著者の発表スライドより)

※経緯2:先日、body閉じタグ前にインラインスクリプトを置くべきか、すべて外部ファイル化するべきか、で意見が割れて、10分くらい問答になったことがあり。デプロイが半手動で(PHP系はrsyncでリリース、staticコンテンツはFTPでupしてからrsync)、1日10回くらいそのリリース作業を普通にやったりしているので、全部外部ファイル化して手動デプロイすることは、無理なのです。デプロイの自動化というテーマがまず先にあって、これが自作で作ろうとすると一手間で。。。


で、担当サイトのHTTPウォーターフローを分析したのですが、「これをやったら劇的に改善できる」というようなポイントは、無かった・・・。いろんな項目が「ちょっとずつ」悪くて(サーバサイドの処理時間、ファイル本数、画像最適化、etc)、それらの総体として、「速くはないな」という状態でした。地道に積み上げるしかない。


これから試してベンチを取ろうと思ったことメモ。
1. キャッシュの見直し

サーバサイド。アプリケーションキャッシュ設計が最適化されているか、全体的に見直す。
jQueryAjaxを使っているところは、jQueryのキャッシュオプションを効かせる。

2. 非同期ロード

script dom element を使ってみる。

 var ga = document.createElement('script');
 ga.type = 'text/javascript'; ga.async = true;
 ga.src = ('https:' == document.location.protocol ?
    'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
 var s = document.getElementsByTagName('script')[0];
 s.parentNode.insertBefore(ga, s);

このようにスクリプト生成すると、ブロックされない。おなじみgoogle analyticsコードでの実例。

http://www.stevesouders.com/blog/2008/12/27/coupling-async-scripts/
http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/

Twitterも使っているらしいLAB.js。
http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/loading-and-blocking-javascript-labjs/
Lab.jsは、部分利用用途ではないもよう。やるなら全部これに置き換えたいので、新規で何か作る機会があった時に使ってみたい。

3. FirstByte

日本語版の特別付録で付いていた、Yahoo!Japan の事例で、そんなやり方があったのかと思った。headタグだけ先に出力フラッシュする。headタグ内に書かれた内容の解析をブラウザがページロード待ちの時間を使って先にやってくれるケースがあるというもの。まあでもここまで凝ったことは普通やらなくて良いかもしれない。

    • -

メモ1:chrome と FF で計測結果をhar形式で保存できる。保存結果を後から har viewer で見ることもできる。
http://weble.org/2012/04/24/network-export
メモ2:リクエスト本数を削る、という意味で、CSSもUnifyした方が良い、ということを↓このスライドを見て思い出した。
http://www.slideshare.net/DeNA_open_events/frontend-optimization-denacreativeseminar
メモ3:この分野の素晴らしいまとめが。
http://d.hatena.ne.jp/absj31/20120929/1348929687