WebSocketの遅延を計測して比較してみた
ゲーム作るのに遅延がどの程度なのか把握するため、計測をしてみた。
環境
- Node.js
- v0.2.5
- SocketIO
- npm, 0.6.1
- websocket-server
- npm, 1.4.01
- Firefox
- iPod touch OS4.2 / NexusOne Android 2.2.1のネットへの接続
計測用コンテンツ
- http://www.syspri.org/test/websocket_test/test.htm
- 環境: さくらVPSサービス + さくら独自ドメイン取得サービス
- 内容: メッセージを送信してサーバーからechoしてもらう。そのときの送信時刻と受信時刻の差分を取り、10回の平均を出力する。メッセージは受信してから次の送信を行う。
- サーバー側ソース: http://www.syspri.org/test/websocket_test/server.js
計測結果
excel: http://ndruger.lolipop.jp/hatena/20101225/websocket_delay.xls
端末 |
コンテンツ置き場 |
ブラウザ |
プロトコル |
遅延 |
---|---|---|---|---|
PC |
ローカル |
Firefox3.5.16 |
XHR |
2.1ms |
SocketIO(transport == xhr-multipart) |
3.8ms |
|||
Firefox4.0b8 |
XHR |
2.7ms |
||
WebSocket |
1.7ms |
|||
SocketIO(transport == WebSocket) |
1.9ms |
|||
Chrome10.0.612.3 dev |
XHR |
2.6ms |
||
WebSocket |
1.9ms |
|||
SocketIO(transport == WebSocket) |
1.9ms |
|||
サクラVPS |
Firefox3.5.16 |
XHR |
19.8ms |
|
SocketIO(transport == xhr-multipart) |
492.5ms(!) |
|||
Firefox4.0b8 |
XHR |
18.1ms |
||
WebSocket |
21ms |
|||
SocketIO(transport == WebSocket) |
17ms |
|||
Chrome10.0.612.3 dev |
XHR |
17.9ms |
||
WebSocket |
18.9ms |
|||
SocketIO(transport == WebSocket) |
16.7ms |
|||
iPod touch OS4.2 |
サクラVPS |
標準ブラウザ |
XHR |
292.2ms |
WebSocket |
150.1ms |
|||
SocketIO(transport == WebSocket) |
168.1ms |
|||
NexusOne Android 2.2.1 |
サクラVPS |
標準ブラウザ |
XHR |
292.6ms |
SocketIO(transport == xhr-polling) |
448.5ms |
|||
Mobile Firefox4.0b1 |
XHR |
343.9ms |
||
SocketIO(transport == xhr-multipart) |
912.9ms |
感想など
- SocketIOに関して
- SocketIOはtransportにWebSocketが選ばれた場合、WebSocketをそのまま使う場合と同じ程度の遅延になる(以前遅くなったのは、npmでないSocketIOを間違った使い方をしていたための模様)
- Firefox3.5にてSocketIOでtransportにxhr-multipartが選ばれた場合の遅延が異常に大きすぎる。もしかしたら使い方を間違えているのかも
- Websocketに関して
- PCの場合、意外にも遅延はXHRと変わらず、メリットはサーバーからの通知の即時性や通信量にあるようだ。iPod touchで遅延が大きくなるのはパケットが細かく切れるから?
- iPod touch / Androidに関して
- 計測方法に関して
- 今回は以前の応答を待ってから送信しているが、応答を待たずに送信するとまた違う傾向が出そう
iPod touch / Androidをゲームの加速度センサー付きコントローラーとして使う場合
前回(iPhone / iPod touch OS4.2をPCブラウザの加速度コントローラーとして使ってみた)の結果からも、200msを超えるとコントローラーとしては厳しい。
iPod / iPhoneはWebSocketを使って、AndroidはWebSocket対応を待ちながら余裕があればXHRで対応するのが妥当。