SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
今できる通信⾼高速化
にトライしたみた	
  
東京Node学園	
  15時限⽬目	
  
Feb	
  10,	
  2015	
  
Yoshiki	
  Shibukawa	
  
GDI	
  
DeNA	
  Co.,	
  Ltd.	
  	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
⾃自⼰己紹介	
  
!  名前:	
  
⁃  渋川よしき	
  (@shibu_̲jp)	
  
!  所属	
  
⁃  DeNAの開発基盤部	
  
⁃  Sphinx-‐‑‒Users.jp,	
  Python温泉	
  
!  好きな⾔言語	
  
⁃  C++,	
  Go,	
  型のある某altJS	
  
!  書いた本・翻訳した本	
  
⁃  つまみぐい勉強法、Mobageを⽀支える技術、
オブジェクト指向JavaScript、スクラム本、
ポモドーロテクニック⼊入⾨門、
エキスパートPythonプログラミング
アート・オブ・コミュニティetc	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
JavaScriptと私	
  
!  2007年年ぐらい	
  
⁃  Prototype.jsよりもMochikit派→⼈人気ないのでjQueryに乗り換え	
  
!  2011年年	
  
⁃  DeNA⼊入社。ngCoreというゲームエンジン上の開発	
  
⁃  オブジェクト指向JavaScript翻訳	
  
!  2012年年	
  
⁃  渡⽶米して引き続きngCore関連の開発	
  
⁃  GUIの開発ツールをQtのJavaScriptバインディングとかJSFLで。	
  
!  2013年年〜~2014年年	
  
⁃  ブラウザで動く全⽂文検索索エンジン(Oktavia)をJSXで作った	
  
⁃  QtのJavaScriptバインディングのJSXバインディング作った	
  
⁃  node.js	
  +	
  MongoDBでモバイルゲームのサーバサイドの実装	
  
!  最近	
  
⁃  Google	
  Apps	
  Scriptぐらい	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
JavaScriptとgoto	
  
!  ラベル付きcontinueを使えば機
械的に変換できます。	
  
!  while⽂文とswitch⽂文の
⼆二段構成+⾏行行先+ジャンプするか
のフラグを保存する変数を⽤用意	
  
!  いったんお尻に⾏行行って、頭に
⾏行行ってから⽬目的地に⾏行行くのが
最初わかりにくく感じますが	
  
!  gistに貼ったよ。	
  #tng15に放流流
したよ	
  
⁃  https://gist.github.com/
shibukawa/
315765020c34f4543665	
  
※Pythonコードも追加	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
謝辞	
  
!  職場でこのアイディアを思いついた時に、話を聞いてくれたり、コメン
トくれたり、いいねと⾔言ってくれた	
  
@uupaa,	
  @damele0n,	
  @yosuke_̲furukawa	
  (特に	
  @uupaaさん)	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
「今できる」とは?	
  
!  Service	
  Workerはまだ実⽤用で使うにはチャレンジすぎる	
  
!  Fetch	
  APIはまだ実⽤用で使うにはチャレンジすぎる	
  
!  今、そこそこ枯れている機能でがんばってみる	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
とある⽇日の発⾒見見	
  
!  LZ4コマンドで遊んでたところ、奇妙な現象に遭遇	
  
JSパーサ(esprima)で⽣生成したJSON(63MB)を	
  
⁃  gzipで圧縮→2.8MB	
  
⁃  lz4で圧縮→3.0MB	
  
⁃  lz4で圧縮した後にgzipで圧縮→1.7MB	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
LZ4とは?	
  
!  圧縮展開速度度重視のアルゴリズム	
  
⁃  ファイル圧縮ではなく、メモリ効率率率や転送速度度アップで利利⽤用される	
  
⁃  MySQLやFreeBSDのZFSのバックエンドでも	
  
⁃  Level	
  DBの裏裏で使われているGoogle	
  Snappyの類似	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
gzipとの組み合わせでファイルサイズがgzip以下に減る	
  
!  主に繰り返しの多いJSONやテキストでこの現象がおきる	
  
!  gzipはウェブのスタンダード	
  
⁃  JavaScriptからは触れられないが、ブラウザ・サーバ間の
転送コスト削減で使われる	
  
⁃  gzipの展開はネイティブで⾏行行われるので⾼高速	
  
!  lz4は⾼高速性の秘訣はシンプルな展開コード	
  
⁃  バイト単位での辞書からのコピー、出⼒力力バッファ内のウインドウの
コピーのみなのでJavaScriptでも実装可能	
  
⁃  (参考)	
  LZ4の速さの秘密に迫ってみる	
  (by@komiya_̲atsushiさん)
http://www.slideshare.net/komiyaatsushi/dsirnlp-‐‑‒3-‐‑‒lz4	
  
!  ユーザにもうれしいはず	
  
⁃  ローカルのファイルサイズも削減(JSONなら1/20以下)	
  
⁃  通信も⾼高速化	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
実装してみた	
  
!  LZ4	
  (展開コードのみ)	
  
⁃  http://github.com/shibukawa/lz4.jsx	
  
!  最速ハッシュのxxhash	
  (lz4のチェックサムで利利⽤用)	
  
⁃  http://github.com/shibukawa/xxhash.jsx	
  
!  LZ4展開機能付きXHR	
  
⁃  http://github.com/shibukawa/lz4-‐‑‒xhr.jsx	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
速度度のための⼯工夫	
  
!  JSX	
  (DeNA製の速度度重視のaltJS)	
  
⁃  さらに積極的にNative構⽂文を駆使	
  
⁃  実装時のメモ:	
  C⾔言語的にJavaScriptを使う	
  (qiita)	
  
•  http://qiita.com/shibukawa/items/9cd0dbb5b5ad512b7c86	
  
!  WebWorker	
  
⁃  通信とLZ4の展開コードは別スレッドで	
  
⁃  ArrayBufferの形式でメインスレッドへ	
  
•  (参考)	
  Transferable	
  Objects	
  Lightning	
  Fast!	
  
⁃  http://updates.html5rocks.com/2011/12/Transferable-‐‑‒Objects-‐‑‒
Lightning-‐‑‒Fast	
  
⁃  メインスレッド側で⽂文字列列へエンコードしてJSONを読む	
  
•  (参考)	
  Easier	
  ArrayBuffer	
  <-‐‑‒>	
  String	
  conversion	
  with	
  the	
  Encoding	
  API	
  	
  
⁃  http://updates.html5rocks.com/2014/08/Easier-‐‑‒ArrayBuffer-‐‑‒-‐‑‒-‐‑‒
String-‐‑‒conversion-‐‑‒with-‐‑‒the-‐‑‒Encoding-‐‑‒API	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
ベンチマーク	
  
!  expressでcompressionミドルウェアを⼊入れて、すべてのファイル
形式に強制的にgzipエンコードがかかるように設定	
  
⁃  デフォルトは1kB以上の,	
  テキストファイルのみ	
  
!  3.4MBぐらいのJSONをテストで⽤用意	
  
!  Apple製のNetwork	
  Link	
  Conditionerを⼊入れて、3G/LTE相当の
通信環境を再現し、⼗十分に早いWifi環境でNexus	
  5からアクセス	
  
⁃  3G:	
  下り	
  780kbps,	
  上り	
  330kbps,	
  遅延100mS/⽚片道	
  
⁃  LTE:	
  下り	
  11Mbps,	
  上り	
  5Mbps,	
  遅延5mS/⽚片道	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
結果	
  
0	
  
500	
  
1000	
  
1500	
  
LZ4+XHR	
   XHR	
   LZ4+XHR	
   XHR	
  
3G	
   LTE	
  
JSONパース	
  
ワーカ終了了	
  
LZ4展開	
  
ダウンロード	
  
ワーカ起動	
  
時間[ミリ秒]	
  
※各5回計測して平均	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
3G	
 LTE	
LZ4+XHR	
 XHR	
 LZ4+XHR	
 XHR	
ワーカ起動	
   2.2	
 0	
 2.8	
 0	
ダウンロード	
   924.4	
 1254.2	
 97.2	
 126.8	
LZ4展開	
   171.4	
 0	
 150.2	
 0	
ワーカ終了了	
   1.4	
 0	
 1	
 0	
JSONパース	
   148.6	
 87.2	
 132	
 65.2	
!  ダウンロードは確かに早くなった。	
  
⁃  サイズ差よりも⼤大きい。サーバ側でのgzip圧縮時間の差?	
  
!  デコードのコストが毎回かかる	
  
⁃  パース前のテキストのデコードもちょっとかかっている	
  
⁃  通信が早いとコストが回収しきれなくなる	
  
!  WebWorkerのコストはほぼタダヽ(=´́▽`̀=)ノ	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
もうちょっと早くなるんじゃ・・・	
  
!  コード展開してループ回数を減らせ、という
偉⼤大な先⼈人の教え	
  
⁃  X68000マシン語プログラミング	
  
!  Uint8Arrayで1バイトずつコピーしていた	
  
⁃  アライメントが揃っている時に、
Uint16Array、Uint32Arrayで⾼高速化!	
  
⁃  https://gist.github.com/shibukawa/18c04fce35eda662edaa	
  
⁃  ⾒見見込み:	
  25%の確率率率で4倍、25%の確率率率で2倍、50%の確率率率で1倍→2倍!	
  
!  実際に組み込むと速度度変わらず	
  orz	
  
⁃  キャッシュもJITもない時代の⾼高速化技法は役に⽴立立たず	
  
	
   	
  	
  
while (srcIndex < endIndex) {
buffer[dstIndex++] = buffer[srcIndex++];
}	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
現状のコードのメリットとデメリット	
  
!  メリット	
  
⁃  通信量量削減は達成できた	
  
•  7GB制限とかある今の時代にはメリット	
  
⁃  WebWorker側で通信しているので、クライアントコード外で
Service	
  Workerのようにフックがいろいろかけられる	
  
•  通信せずにテスト⽤用に静的コンテンツを返したりとか。データ的なDI。	
  
•  キャッシュ。サイズが⼩小さいのでローカルストレージにもやさしい。	
  
!  デメリット	
  
⁃  連続10回とかダウンロードすると発熱が少しある	
  
⁃  トータルのスループットは⼤大幅には変わらない	
  
⁃  そもそもある程度度⼤大きいJSONじゃないとlz4で⼩小さくならない	
  
Copyright	
  (C)	
  DeNA	
  Co.,Ltd.	
  All	
  Rights	
  Reserved.	
  
改善の余地はまだまだ!	
  
!  きちんとブラウザでプロファイリングする	
  
⁃  node.jsで机上のベンチばかりだったので	
  
!  展開コードの⾼高速化	
  
⁃  ECMAScript	
  6にMozillaが⼊入れようとしている
TypedArray.prototype.copyWithinを使う	
  
⁃  チェックサムを無視する(他でチェックできるなら)	
  
⁃  asm.js	
  
!  ウェブアプリでなければネイティブ側で展開	
  
⁃  アプリ内プロキシサーバとか?	
  
⁃  JavaScriptでも100MB/Sぐらいの展開速度度は出るが、公式の
ベンチマークは2GB/Sなので、1/20ぐらい。	
  

Más contenido relacionado

La actualidad más candente

The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive ExtensionsYoshifumi Kawai
 
Ruby way-openstack.keynote
Ruby way-openstack.keynoteRuby way-openstack.keynote
Ruby way-openstack.keynoteUchio Kondo
 
Imprementation of realtime_networkgame
Imprementation of realtime_networkgameImprementation of realtime_networkgame
Imprementation of realtime_networkgameSatoshi Yamafuji
 
ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01Takeshi Komiya
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」Yoshiki Shibukawa
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Yoshiyuki Nakamura
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときRyunosuke SATO
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情Junichi Ishida
 
人間たちとsystemd
人間たちとsystemd人間たちとsystemd
人間たちとsystemdUchio Kondo
 
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発するHiroyuki Kusu
 
emruby: ブラウザで動くRuby
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRubymametter
 
WiredTigerストレージエンジン楽しい
WiredTigerストレージエンジン楽しいWiredTigerストレージエンジン楽しい
WiredTigerストレージエンジン楽しいAkihiro Kuwano
 
サーバサイドNodeの使い道
サーバサイドNodeの使い道サーバサイドNodeの使い道
サーバサイドNodeの使い道pospome
 
Werkzeugを使ってみた #osakapy 2016/04
Werkzeugを使ってみた #osakapy 2016/04Werkzeugを使ってみた #osakapy 2016/04
Werkzeugを使ってみた #osakapy 2016/04敦志 金谷
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsGo Sueyoshi (a.k.a sue445)
 
Project Jigsaw #kanjava
Project Jigsaw #kanjavaProject Jigsaw #kanjava
Project Jigsaw #kanjavaYuji Kubota
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャota42y
 
マークアップ言語の拡張 メリットとデメリット #hankumi
マークアップ言語の拡張 メリットとデメリット #hankumiマークアップ言語の拡張 メリットとデメリット #hankumi
マークアップ言語の拡張 メリットとデメリット #hankumiTakeshi Komiya
 

La actualidad más candente (20)

The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive Extensions
 
Ruby way-openstack.keynote
Ruby way-openstack.keynoteRuby way-openstack.keynote
Ruby way-openstack.keynote
 
Imprementation of realtime_networkgame
Imprementation of realtime_networkgameImprementation of realtime_networkgame
Imprementation of realtime_networkgame
 
ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
 
Nodeについて
NodeについてNodeについて
Nodeについて
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないとき
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
 
人間たちとsystemd
人間たちとsystemd人間たちとsystemd
人間たちとsystemd
 
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
 
emruby: ブラウザで動くRuby
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRuby
 
WiredTigerストレージエンジン楽しい
WiredTigerストレージエンジン楽しいWiredTigerストレージエンジン楽しい
WiredTigerストレージエンジン楽しい
 
サーバサイドNodeの使い道
サーバサイドNodeの使い道サーバサイドNodeの使い道
サーバサイドNodeの使い道
 
Werkzeugを使ってみた #osakapy 2016/04
Werkzeugを使ってみた #osakapy 2016/04Werkzeugを使ってみた #osakapy 2016/04
Werkzeugを使ってみた #osakapy 2016/04
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
Project Jigsaw #kanjava
Project Jigsaw #kanjavaProject Jigsaw #kanjava
Project Jigsaw #kanjava
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
マークアップ言語の拡張 メリットとデメリット #hankumi
マークアップ言語の拡張 メリットとデメリット #hankumiマークアップ言語の拡張 メリットとデメリット #hankumi
マークアップ言語の拡張 メリットとデメリット #hankumi
 

Destacado

Extensible web
Extensible webExtensible web
Extensible webJxck Jxck
 
Socket.ioを使ってライフゲームで遊ぶ
Socket.ioを使ってライフゲームで遊ぶSocket.ioを使ってライフゲームで遊ぶ
Socket.ioを使ってライフゲームで遊ぶ孝平 高田
 
Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()
Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()
Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()Isamu Suzuki
 
いまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておく
いまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておくいまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておく
いまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておくTakahiro YAMAGUCHI
 
Node.jsで対戦ゲーム作ったよ
Node.jsで対戦ゲーム作ったよNode.jsで対戦ゲーム作ったよ
Node.jsで対戦ゲーム作ったよYuusuke Takeuchi
 
Scalable Node.js with Redis Store
Scalable Node.js with Redis StoreScalable Node.js with Redis Store
Scalable Node.js with Redis Storekamiyam .
 
9 anti-patterns for node.js teams
9 anti-patterns for node.js teams9 anti-patterns for node.js teams
9 anti-patterns for node.js teamsJeff Harrell
 
Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015
Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015
Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015Fastly
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトTakehiko YOSHIDA
 
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法shigeki_ohtsu
 
TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話Kazuho Oku
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechconYosaku Toyama
 
これからの Microservices
これからの Microservicesこれからの Microservices
これからの MicroservicesToru Yamaguchi
 

Destacado (14)

Extensible web
Extensible webExtensible web
Extensible web
 
Socket.ioを使ってライフゲームで遊ぶ
Socket.ioを使ってライフゲームで遊ぶSocket.ioを使ってライフゲームで遊ぶ
Socket.ioを使ってライフゲームで遊ぶ
 
Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()
Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()
Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()
 
いまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておく
いまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておくいまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておく
いまNode Express4で書いてるディレクターが
初めて書き始める2ヶ月前くらいの自分に言っておく
 
Node.jsで対戦ゲーム作ったよ
Node.jsで対戦ゲーム作ったよNode.jsで対戦ゲーム作ったよ
Node.jsで対戦ゲーム作ったよ
 
Nodeを稼働させる
Nodeを稼働させるNodeを稼働させる
Nodeを稼働させる
 
Scalable Node.js with Redis Store
Scalable Node.js with Redis StoreScalable Node.js with Redis Store
Scalable Node.js with Redis Store
 
9 anti-patterns for node.js teams
9 anti-patterns for node.js teams9 anti-patterns for node.js teams
9 anti-patterns for node.js teams
 
Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015
Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015
Mitigating Security Threats with Fastly - Joe Williams at Fastly Altitude 2015
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフト
 
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法
 
TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
 
これからの Microservices
これからの Microservicesこれからの Microservices
これからの Microservices
 

Similar a 東京Node学園 今できる通信高速化にトライしてみた

Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Tomoki Hasegawa
 
Livlisのcakephp事例
Livlisのcakephp事例Livlisのcakephp事例
Livlisのcakephp事例Masahiro Saito
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Tomoki Hasegawa
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
NodeにしましょうYuzo Hebishima
 
HTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なことHTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なことMasakazu Muraoka
 
Riot.jsを用いたweb開発 takusuta tech conf #1
Riot.jsを用いたweb開発   takusuta tech conf #1Riot.jsを用いたweb開発   takusuta tech conf #1
Riot.jsを用いたweb開発 takusuta tech conf #1Keisuke Imai
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについてMasahito Zembutsu
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargatebitbank, Inc. Tokyo, Japan
 
OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向NTT Software Innovation Center
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャShiroyagi Corporation
 
Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語Yossy Taka
 
リモートデバッグツール Weinerをつかってみた
リモートデバッグツール Weinerをつかってみたリモートデバッグツール Weinerをつかってみた
リモートデバッグツール WeinerをつかってみたMasakazu Muraoka
 
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会Takayuki Shimizukawa
 
HTML5とWeb開発に関する最新動向
HTML5とWeb開発に関する最新動向HTML5とWeb開発に関する最新動向
HTML5とWeb開発に関する最新動向Shumpei Shiraishi
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersTakeshi Arabiki
 
2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open sourceYoshiyuki Nakamura
 
PythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEGPythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEGJun Okazaki
 
フロントエンド技術の変遷
フロントエンド技術の変遷フロントエンド技術の変遷
フロントエンド技術の変遷Ryo Higashigawa
 

Similar a 東京Node学園 今できる通信高速化にトライしてみた (20)

Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応
 
Livlisのcakephp事例
Livlisのcakephp事例Livlisのcakephp事例
Livlisのcakephp事例
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
Spring I/O 2015 報告
Spring I/O 2015 報告Spring I/O 2015 報告
Spring I/O 2015 報告
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
HTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なことHTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なこと
 
Riot.jsを用いたweb開発 takusuta tech conf #1
Riot.jsを用いたweb開発   takusuta tech conf #1Riot.jsを用いたweb開発   takusuta tech conf #1
Riot.jsを用いたweb開発 takusuta tech conf #1
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargate
 
OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
 
Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語
 
リモートデバッグツール Weinerをつかってみた
リモートデバッグツール Weinerをつかってみたリモートデバッグツール Weinerをつかってみた
リモートデバッグツール Weinerをつかってみた
 
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
 
HTML5とWeb開発に関する最新動向
HTML5とWeb開発に関する最新動向HTML5とWeb開発に関する最新動向
HTML5とWeb開発に関する最新動向
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
 
2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source
 
開発合宿!!!!
開発合宿!!!!開発合宿!!!!
開発合宿!!!!
 
PythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEGPythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEG
 
フロントエンド技術の変遷
フロントエンド技術の変遷フロントエンド技術の変遷
フロントエンド技術の変遷
 

Más de Yoshiki Shibukawa

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料Yoshiki Shibukawa
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料Yoshiki Shibukawa
 
Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsYoshiki Shibukawa
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Yoshiki Shibukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Yoshiki Shibukawa
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript ProgrammingYoshiki Shibukawa
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会Yoshiki Shibukawa
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。Yoshiki Shibukawa
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Yoshiki Shibukawa
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Yoshiki Shibukawa
 

Más de Yoshiki Shibukawa (20)

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
 
Golang tokyo #7 qtpm
Golang tokyo #7 qtpmGolang tokyo #7 qtpm
Golang tokyo #7 qtpm
 
Mithril
MithrilMithril
Mithril
 
Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and Errors
 
Excelの話
Excelの話Excelの話
Excelの話
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 
アンラーニング
アンラーニングアンラーニング
アンラーニング
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
 
大規模JavaScript開発
大規模JavaScript開発大規模JavaScript開発
大規模JavaScript開発
 
Xpjug基調lt2011
Xpjug基調lt2011Xpjug基調lt2011
Xpjug基調lt2011
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript Programming
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会
 
Pomodoro technique
Pomodoro techniquePomodoro technique
Pomodoro technique
 
Bitbucket&mercurial
Bitbucket&mercurialBitbucket&mercurial
Bitbucket&mercurial
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。
 
Erlang and I and Sphinx.
Erlang and I and Sphinx.Erlang and I and Sphinx.
Erlang and I and Sphinx.
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?
 

東京Node学園 今できる通信高速化にトライしてみた

  • 1. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   今できる通信⾼高速化 にトライしたみた   東京Node学園  15時限⽬目   Feb  10,  2015   Yoshiki  Shibukawa   GDI   DeNA  Co.,  Ltd.    
  • 2. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   ⾃自⼰己紹介   !  名前:   ⁃  渋川よしき  (@shibu_̲jp)   !  所属   ⁃  DeNAの開発基盤部   ⁃  Sphinx-‐‑‒Users.jp,  Python温泉   !  好きな⾔言語   ⁃  C++,  Go,  型のある某altJS   !  書いた本・翻訳した本   ⁃  つまみぐい勉強法、Mobageを⽀支える技術、 オブジェクト指向JavaScript、スクラム本、 ポモドーロテクニック⼊入⾨門、 エキスパートPythonプログラミング アート・オブ・コミュニティetc  
  • 3. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   JavaScriptと私   !  2007年年ぐらい   ⁃  Prototype.jsよりもMochikit派→⼈人気ないのでjQueryに乗り換え   !  2011年年   ⁃  DeNA⼊入社。ngCoreというゲームエンジン上の開発   ⁃  オブジェクト指向JavaScript翻訳   !  2012年年   ⁃  渡⽶米して引き続きngCore関連の開発   ⁃  GUIの開発ツールをQtのJavaScriptバインディングとかJSFLで。   !  2013年年〜~2014年年   ⁃  ブラウザで動く全⽂文検索索エンジン(Oktavia)をJSXで作った   ⁃  QtのJavaScriptバインディングのJSXバインディング作った   ⁃  node.js  +  MongoDBでモバイルゲームのサーバサイドの実装   !  最近   ⁃  Google  Apps  Scriptぐらい  
  • 4. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   JavaScriptとgoto   !  ラベル付きcontinueを使えば機 械的に変換できます。   !  while⽂文とswitch⽂文の ⼆二段構成+⾏行行先+ジャンプするか のフラグを保存する変数を⽤用意   !  いったんお尻に⾏行行って、頭に ⾏行行ってから⽬目的地に⾏行行くのが 最初わかりにくく感じますが   !  gistに貼ったよ。  #tng15に放流流 したよ   ⁃  https://gist.github.com/ shibukawa/ 315765020c34f4543665   ※Pythonコードも追加  
  • 5. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   謝辞   !  職場でこのアイディアを思いついた時に、話を聞いてくれたり、コメン トくれたり、いいねと⾔言ってくれた   @uupaa,  @damele0n,  @yosuke_̲furukawa  (特に  @uupaaさん)  
  • 6. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   「今できる」とは?   !  Service  Workerはまだ実⽤用で使うにはチャレンジすぎる   !  Fetch  APIはまだ実⽤用で使うにはチャレンジすぎる   !  今、そこそこ枯れている機能でがんばってみる  
  • 7. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   とある⽇日の発⾒見見   !  LZ4コマンドで遊んでたところ、奇妙な現象に遭遇   JSパーサ(esprima)で⽣生成したJSON(63MB)を   ⁃  gzipで圧縮→2.8MB   ⁃  lz4で圧縮→3.0MB   ⁃  lz4で圧縮した後にgzipで圧縮→1.7MB  
  • 8. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   LZ4とは?   !  圧縮展開速度度重視のアルゴリズム   ⁃  ファイル圧縮ではなく、メモリ効率率率や転送速度度アップで利利⽤用される   ⁃  MySQLやFreeBSDのZFSのバックエンドでも   ⁃  Level  DBの裏裏で使われているGoogle  Snappyの類似  
  • 9. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   gzipとの組み合わせでファイルサイズがgzip以下に減る   !  主に繰り返しの多いJSONやテキストでこの現象がおきる   !  gzipはウェブのスタンダード   ⁃  JavaScriptからは触れられないが、ブラウザ・サーバ間の 転送コスト削減で使われる   ⁃  gzipの展開はネイティブで⾏行行われるので⾼高速   !  lz4は⾼高速性の秘訣はシンプルな展開コード   ⁃  バイト単位での辞書からのコピー、出⼒力力バッファ内のウインドウの コピーのみなのでJavaScriptでも実装可能   ⁃  (参考)  LZ4の速さの秘密に迫ってみる  (by@komiya_̲atsushiさん) http://www.slideshare.net/komiyaatsushi/dsirnlp-‐‑‒3-‐‑‒lz4   !  ユーザにもうれしいはず   ⁃  ローカルのファイルサイズも削減(JSONなら1/20以下)   ⁃  通信も⾼高速化  
  • 10. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   実装してみた   !  LZ4  (展開コードのみ)   ⁃  http://github.com/shibukawa/lz4.jsx   !  最速ハッシュのxxhash  (lz4のチェックサムで利利⽤用)   ⁃  http://github.com/shibukawa/xxhash.jsx   !  LZ4展開機能付きXHR   ⁃  http://github.com/shibukawa/lz4-‐‑‒xhr.jsx  
  • 11. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   速度度のための⼯工夫   !  JSX  (DeNA製の速度度重視のaltJS)   ⁃  さらに積極的にNative構⽂文を駆使   ⁃  実装時のメモ:  C⾔言語的にJavaScriptを使う  (qiita)   •  http://qiita.com/shibukawa/items/9cd0dbb5b5ad512b7c86   !  WebWorker   ⁃  通信とLZ4の展開コードは別スレッドで   ⁃  ArrayBufferの形式でメインスレッドへ   •  (参考)  Transferable  Objects  Lightning  Fast!   ⁃  http://updates.html5rocks.com/2011/12/Transferable-‐‑‒Objects-‐‑‒ Lightning-‐‑‒Fast   ⁃  メインスレッド側で⽂文字列列へエンコードしてJSONを読む   •  (参考)  Easier  ArrayBuffer  <-‐‑‒>  String  conversion  with  the  Encoding  API     ⁃  http://updates.html5rocks.com/2014/08/Easier-‐‑‒ArrayBuffer-‐‑‒-‐‑‒-‐‑‒ String-‐‑‒conversion-‐‑‒with-‐‑‒the-‐‑‒Encoding-‐‑‒API  
  • 12. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   ベンチマーク   !  expressでcompressionミドルウェアを⼊入れて、すべてのファイル 形式に強制的にgzipエンコードがかかるように設定   ⁃  デフォルトは1kB以上の,  テキストファイルのみ   !  3.4MBぐらいのJSONをテストで⽤用意   !  Apple製のNetwork  Link  Conditionerを⼊入れて、3G/LTE相当の 通信環境を再現し、⼗十分に早いWifi環境でNexus  5からアクセス   ⁃  3G:  下り  780kbps,  上り  330kbps,  遅延100mS/⽚片道   ⁃  LTE:  下り  11Mbps,  上り  5Mbps,  遅延5mS/⽚片道  
  • 13. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   結果   0   500   1000   1500   LZ4+XHR   XHR   LZ4+XHR   XHR   3G   LTE   JSONパース   ワーカ終了了   LZ4展開   ダウンロード   ワーカ起動   時間[ミリ秒]   ※各5回計測して平均  
  • 14. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   3G LTE LZ4+XHR XHR LZ4+XHR XHR ワーカ起動   2.2 0 2.8 0 ダウンロード   924.4 1254.2 97.2 126.8 LZ4展開   171.4 0 150.2 0 ワーカ終了了   1.4 0 1 0 JSONパース   148.6 87.2 132 65.2 !  ダウンロードは確かに早くなった。   ⁃  サイズ差よりも⼤大きい。サーバ側でのgzip圧縮時間の差?   !  デコードのコストが毎回かかる   ⁃  パース前のテキストのデコードもちょっとかかっている   ⁃  通信が早いとコストが回収しきれなくなる   !  WebWorkerのコストはほぼタダヽ(=´́▽`̀=)ノ  
  • 15. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   もうちょっと早くなるんじゃ・・・   !  コード展開してループ回数を減らせ、という 偉⼤大な先⼈人の教え   ⁃  X68000マシン語プログラミング   !  Uint8Arrayで1バイトずつコピーしていた   ⁃  アライメントが揃っている時に、 Uint16Array、Uint32Arrayで⾼高速化!   ⁃  https://gist.github.com/shibukawa/18c04fce35eda662edaa   ⁃  ⾒見見込み:  25%の確率率率で4倍、25%の確率率率で2倍、50%の確率率率で1倍→2倍!   !  実際に組み込むと速度度変わらず  orz   ⁃  キャッシュもJITもない時代の⾼高速化技法は役に⽴立立たず         while (srcIndex < endIndex) { buffer[dstIndex++] = buffer[srcIndex++]; }  
  • 16. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   現状のコードのメリットとデメリット   !  メリット   ⁃  通信量量削減は達成できた   •  7GB制限とかある今の時代にはメリット   ⁃  WebWorker側で通信しているので、クライアントコード外で Service  Workerのようにフックがいろいろかけられる   •  通信せずにテスト⽤用に静的コンテンツを返したりとか。データ的なDI。   •  キャッシュ。サイズが⼩小さいのでローカルストレージにもやさしい。   !  デメリット   ⁃  連続10回とかダウンロードすると発熱が少しある   ⁃  トータルのスループットは⼤大幅には変わらない   ⁃  そもそもある程度度⼤大きいJSONじゃないとlz4で⼩小さくならない  
  • 17. Copyright  (C)  DeNA  Co.,Ltd.  All  Rights  Reserved.   改善の余地はまだまだ!   !  きちんとブラウザでプロファイリングする   ⁃  node.jsで机上のベンチばかりだったので   !  展開コードの⾼高速化   ⁃  ECMAScript  6にMozillaが⼊入れようとしている TypedArray.prototype.copyWithinを使う   ⁃  チェックサムを無視する(他でチェックできるなら)   ⁃  asm.js   !  ウェブアプリでなければネイティブ側で展開   ⁃  アプリ内プロキシサーバとか?   ⁃  JavaScriptでも100MB/Sぐらいの展開速度度は出るが、公式の ベンチマークは2GB/Sなので、1/20ぐらい。