Your SlideShare is downloading. ×
スマートフォン勉強会@関東 #16 - AndroidでメガバイトなJSONの扱いを高速化する
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

スマートフォン勉強会@関東 #16 - AndroidでメガバイトなJSONの扱いを高速化する

8,545

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,545
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. AndroidでメガバイトなJSONの扱いを高速化する フェンリル株式会社 西田 剛
  • 2. 内容● 自己紹介 ● プログラミング歴● Javaについて ● 余談: C#+WP7について● JSON処理高速化 - 経緯● JSON処理高速化 - 内容● まとめ● 今後● 宣伝
  • 3. 自己紹介● 西田です● 大阪と神戸の中間くらいの場所からやって来ました● フェンリル(株)でSleipnir Mobile for Androidの開発やってます ● プログラマ1人 + デザイナー1人 + プロモーション1人なチーム +α● Sleipnir Mobile for Windows Phoneの開発にも少し関わりました● 今回が人生初のセッション ● 人前こわい… (´;ω;`) ウッ…
  • 4. 自己紹介 - プログラミング歴● スマートフォン向けアプリの開発は今年から ● Android歴 == Java歴 == 7ヶ月 ● Windows Phone 7歴 == C#歴 == 2週間● 以前は専らC++ ● 元々はSleipnir 3 for Windows開発担当(約半年) ● 前職はC++で3D CAD/CAMシステムの開発 – 金型とか機械加工とかの分野 ● 大学生時代はC++で3Dグラフィックス ● もっと前はN88-BASIC● あとVimスクリプトも昔やってました ● テキストエディタのプラグイン開発 – AutoComplPop とか FuzzyFinder とか (メンテしてなくてすみません)
  • 5. Javaって・・・ええやん・・・● Androidアプリ開発を始める前: ● Javaってなんか軟弱そう。ゴテゴテしてるのもダサい・・・ ● C++こそがプロの道具。メモリ管理しない男の人って・・・ ● Vim最強。マウスとキーボード往復してたら腕が破壊される● Androidアプリ開発を始めた後: ● 無名クラスでリスナー実装するの気持いい!サクサク書ける! ● GC楽です。循環参照こわくない。 ● Eclipseハンパなく捗る・・・マジ神アプリ – C++はVisual Studioが捗る。マウスとキーボードの往復で腕も鍛えられてよい。
  • 6. 余談: WP7アプリのコード書いてて思ったこと● 通信が非同期でしかできないのは辛い(WebClient) ● コールバックの中でコールバックがコールバックして・・・ ● ↑このザマだよ● 「りあくてぃぶ・えくすてんしょん」とやらを使うといいらしい・・・?● Windows Phone Advent Calendar “ひとり” で取り上げて欲しいです!
  • 7. そろそろ本題
  • 8. 経緯● Sleipnir Mobile for Android 1.0 リリース! したけど・・・ ● ブックマークの件数が多いと同期に5分くらいかかる – しかも不安定 ● 売りにしている機能だから何とかしないとヤバイ● ブックマーク周りの設計 ● ブックマークはSQLiteで管理 ● ブックマーク同期の流れは大体次の通り: – 受信: サーバー → JSON → アプリのブックマークDB – 送信: アプリのブックマークDB → JSON → サーバー – マージ: サーバー → JSON → ブックマークDB にマージ→ JSON → サーバー
  • 9. 経緯 - ボトルネックはどこ?● とりあえず推測してみる ● 通信?3Gが遅い? ● SQLite?コミットが遅い? ● ひょっとして NDK 周り?だったら大変だ・・・● 「うだうだ言ってても仕方ないからプロファイリングしてみ?」 ● by 課長(Apple & Emacs好き)● というわけでTraceview を使って調べると・・・ ● JSON処理してるところでアホみたいに時間食ってる・・・! – プロファイリング重要 – JSONのサイズを見てみるとメガバイトオーダーでした● というわけで、JSON周りを高速化しよう!
  • 10. 高速化 – Google Gson 導入● とりあえず「Java JSON performance」とかでググってみる● GsonっていうJSONライブラリが速いらしい● ライセンスが扱いやすい ● Apache License 2.0● とりあえず、単純に置き換えてみる ● 1~2割高速化!● でもまだまだ足りない!
  • 11. 高速化 - メモリ節約してGC回避● Traceviewをよく調べる ● GC走りまくってる・・・ – そういえばLogcatにGC関連のメッセージがいっぱい流れてた● メモリ使用状況 ● メガバイトなJSONがメモリに乗ってて、それをサーバーへPOSTで送信するた めのapplication/x-www-form-urlencodedでエンコードしたさらにデカいバイ ト列がメモリに乗ってる – PCだと大した問題にならない規模だけど、スマホだとクリティカル ● スマホ開発舐めてた・・・● GCを減らすには ● 使用メモリが一定量を超えるとGCが頻繁に発生する ● ⇒使用メモリのピーク量を下げつつ、ピークが継続する期間を減らす方針で!
  • 12. 高速化 - ストリームでメモリ節約● JSON文字列をエンコードしたバイト列がデカ過ぎるのでなんとかする ● そもそも全部メモリに乗せる必要ない ● ストリームでPOSTしよう! ● 4096バイトずつエンコードするストリームクラスを作成 ● 解決!
  • 13. 高速化 - その他のメモリ節約バックグラウンドActivityがメモリを圧迫していた● onPause でViewを解放して onResume で再構築する
  • 14. 高速化 - メモリ節約の効果● だいぶ速くなった! ● 5分→1分くらい● やったー! ● メモリ足りなくて落ちるのも直った! ● でもまだまだ満足できるレベルじゃない – 3秒以内が理想 ● いつかは・・・
  • 15. 高速化 - SharedPreferences● 他に改善できるとこないかな ● Traceview確認● SharedPreferences.Editor.commit() が1割近く占めてる! ● ブックマークDBが更新されたかどうかをSharedPreferencesで記録していた ● JSONをデシリアライズしてブックマークDBを構築しているときに、それが毎回 更新・コミットされている● 無駄なコミットを排除して高速化
  • 16. JSON処理高速化まとめ● Traceview を使って計測しよう● Google Gsonを使おう● メモリを節約しよう ● 送信するときはストリームを使って段階的にエンコードしよう ● バックグラウンドActivityの重いViewは解放しよう● SharedPreferences の書き込みは必要最小限にしよう
  • 17. 今後さらに高速化するために● 現在のボトルネック ● エスケープされた文字列のデコード – “u3051” みたいなやつ – こいつを処理するためのInteger.parseIntの呼び出しが多すぎる● 解決策 ● JSONやめよう – MessagePackがいいらしい ● ブックマーク同期のプロトコル自体を見直すことも必要● 今後、どんどん改善していきます!
  • 18. 最後に・・・宣伝させてください!● 昨晩 Sleipnir Mobile for Windows Phone 正式版 を公開しました! ● タブブラウザです! – 下フリックでタブを閉じたり、ダブルタップでタブを保護したりできます ● ブックマーク同期ができます! – Windows/Mac/iPhone/Android の Sleipnir と同期できます ● User-Agent が変更できます! – Windows Phone のことスマホ扱いしてくれるページ、少ないよね… (´;ω;`) ウッ… ● これからもどんどん改善していきますので、応援して頂ければ嬉しいです!● 他の Sleipnir ファミリーもよろしくお願いいたします! ● Sleipnir 3 for Windows ● Sleipnir 3 for Mac ● Sleipnir Mobile for iPhone/iPad ● Sleipnir Mobile for Android
  • 19. おわり ありがとうございました。IIJさん20周年おめでとうございます!

×