WebSocketの遅延を計測して比較してみた

ゲーム作るのに遅延がどの程度なのか把握するため、計測をしてみた。

環境

  • Node.js
    • v0.2.5
  • SocketIO
    • npm, 0.6.1
  • websocket-server
    • npm, 1.4.01
  • Firefox
    • Firefox3.5/4は特定のアドインがあると遅くなるため、アドイン無効のセーフモードで実行している
    • Firefox4は4.0b7 -> 7.0b8でwebsocketが無効化されたため、network.websocket.override-security-block;trueにして無理やり有効化している
    • Firebugデバッグコンソールを開いていると遅くなる速度が変わるので注意
  • iPod touch OS4.2 / NexusOne Android 2.2.1のネットへの接続

計測用コンテンツ

計測結果

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で対応するのが妥当。