Twitter4J を SPDY 対応してみた

※この記事のまとめは Twitter4JのSPDY対応について – TwitPane をご参照ください。

Twitter4Jを次世代HTTPのSPDYに対応してみた。

OkHttpというSPDY&HTTP/2.0対応の超便利ライブラリがあったのでそれを使わせてもらっただけ。


でも後述の通りベンチマーク取ってみたら単独スレッドでの通信では速くないというかむしろ遅くなるんで、あくまでも実験的な実装ということで。
Android/Dalvikだと TFJ-296 対応で強制的に http.keepAlive=false されていてコネクションプールが機能していませんでしたorz
⇒OkHttpのコネクションプールを別途設定することで高速化しました! (詳細は後ほど)

導入方法

下記2つのjarをクラスパス上に(Androidならlibsに)配置するだけ。

あとはtwitter4jが自動的に"twitter4j.internal.http.alternative.HttpClientImpl"を見つけて使ってくれる感じ。Twitter4Jよくできてる。

簡易ベンチマーク(並列実行)

拙作のTwitterクライアントTwitPaneに入れてベンチマーク取ってみた。

showStatusを100msずつずらして11回*1リクエストした結果。SPDY版がいい感じで速いです。

GalaxyNexus SC-04D/Android 4.2

環境 試行1回目(平均所要時間) 2回目
no SPDY, 3G 2095ms 1980ms
SPDY, 3G 1088ms(48%高速) 1398ms(29%高速)
no SPDY, WiFi/B-Flets 654ms 606ms
SPDY, WiFi/B-Flets 527ms(19%高速) 505ms(17%高速)

うまく並列化させると20%くらいは速くなりそうな感じですかね。

http://gyazo.com/8eff90cd42f8a821c862505053f5b6a8.png

測定に使ったコード: https://gist.github.com/takke/8143276

簡易ベンチマーク(シーケンシャル実行)

先ほどのshowStatusのコードを単純に11回繰り返し実行するパターンもやってみました。

環境 平均所要時間
no SPDY, 3G 1409ms
SPDY, 3G 780ms(45%高速)
no SPDY, WiFi/B-Flets 689ms
SPDY, WiFi/B-Flets 452ms(34%高速)

http://gyazo.com/bbca733346713b35a200bc5e725e4a16.png

シーケンシャルに取得するパターンでも高速化されました。
これは使ってみたいと思える改善っぷりですね。素晴らしいです。

*1:10回のつもりだったけどベンチマーク用に10回繰り返したあとに1回本来の処理が走ってた