SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【デブサミ2012】セッションレポート(AD)

【デブサミ2012】17-A-3 レポート
HTML5でどこまでできる? その実力とスマホ向けアプリ開発のポイント

  • X ポスト
  • このエントリーをはてなブックマークに追加

「王道」も「邪道」も使ってJavaScriptのメモリ消費を抑える

 また、紀平氏は、JavaScriptの速度の問題についても説明。JavaScriptが重い理由としては、主にアルゴリズム、JIT(Just In Time)、GC(ガベージコレクション)の3つがあるという。

 アルゴリズムが重いのは設計が悪いということなので、黙って設計を直すしかない。次に、本来は速くするための技術であるはずのJITが重いという場合、考えられるのはevalを使ったり、クロージャを生成していることだ。毎回JITのコンパイルを呼び出すようなコードを書いてしまうと、こうした問題が起こり得る。ただし、これはツールを使って容易に検出できるし、直すのもそう難しくはない。

 「アルゴリズムやJITが重いという状況は、それほど問題にはならない。もっとも厄介で、JavaScriptが重くなる最大の原因は、GCにある」(紀平氏)

 Androidでかなり複雑なJavaScriptを描いていると、よくGCが起こる。マイナーGCが起こっているうちはよいが、Full GCが走ってしまうことがあり、ひどい場合には2~3秒間止まってしまう。このような状況を防ぐための方法として、紀平氏は次のようにアドバイスした。

 「V8は世代別GCのアルゴリズムを採用しているので、なるべく新世代にいるうちに、つまり使わないデータはとにかく早く参照を切ることが重要。マイナーGCが走っている段階で全部きれいにしてもらうのが鉄則で、それを守ることで、かなりGCを減らすことができる」

 一方、iOSのMoile Safariの場合は、メモリが足らなくなると「突然落ちる」という特徴がある。これをいかに回避するか、メモリ消費をいかに抑えるかというのは、開発者にとって重要な問題だ。紀平氏は、この対策を「メモリとの戦い」と称して、「王道編」と「邪道編」に分けて解説した。

 「“王道編”としては、やはり一般的によく知られている方法を確実に実行するしかない。大きく分けて2つあるが、まず1つ目は、何度も使うメモリをあらかじめ確保すること。例えば、頻繁に使う画像は最初に全部ロードしておく。2つ目は、上限の決まっているオブジェクトは初期化時に上限まで確保しておくこと。これによって、オブジェクト生成の回数を減らすことが重要」

 また、メモリ消費を抑える対策の前提として、実機上でのメモリ使用量を確認し、自分のコードのどの部分がどれだけメモリを消費するかを把握したいところだが、これについて紀平氏は「メモリとの戦い:邪道編」で言及。

 「“邪道編”の話については、自己責任でお願いしたい。まず、iPhoneシミュレータを使ってMac OS上でメモリ使用量を検証しようとしたが、信用できない結果となった。また、UIWideViewの中にJavaScriptを埋め込んでメモリ使用量を見ようとしたが、これも失敗した。UIWideViewの中で実行されるJavaScriptはJITのコンパイルが働かないので、やはりメモリ効率が全然違ってくる。そこで、褒められたやり方ではないが、一般に“Jailbreak”と呼ばれる方法をとり、ようやくメモリを確認することが可能となった」

 Jailbreakしたうえでtopコマンドを走らせ、Mobile Saffariのメモリ使用量を常にモニタリングできるようになったそうだ。なお、紀平氏によれば、1回のJavaScriptでメモリ使用量が100MBを超えると「危険信号」であり、落ちるリスクが高まるという。

【参考】Jailbreakについて

 Jailbreakはオフィシャルのサポートが受けられない他、様々な重大なリスクを伴う非常に危険な行為であり、強く推奨されません。あくまで自己責任でお願いします。

 さらに、紀平氏は実機でのプロファイルについても解説。自作のプロファイラでは、関数単位でcount、total、selfを取得するほか、どの関数のプロファイルを取得するか指定できるようにしており、CanvasなどのビルトインAPIも指定可能だという。

 「プロファイルの結果は嘘をつかない。自分が重いと感じているところではなく、プロファイルが重いところを改善していくことが、速度の問題などを解消する近道」(紀平氏)

 また、実機でのデバッグについては、console.logの重要性を強調。iPhoneではconsole.logを見られないと思っているユーザも多いが、デバッグログの設定項目を操作するだけでconsole.logを参照できることなどを指摘した。

 終盤では、DeNAのゲームエンジン「ngCore」で開発したゲーム「忍者ロワイヤル」のHTML5バージョンを実際に動かすデモを披露。開発途上のバージョンながら、すでにネイティブアプリに近い速度でゲームを動かすことがHTML5でも可能となっていることをアピールし、紀平氏はセッションを締めくくった。

デモ初披露となったMobageの人気ゲームタイトル「忍者ロワイヤル」のHTML5バージョン(開発中)
デモ初披露となったMobageの人気ゲームタイトル「忍者ロワイヤル」のHTML5バージョン(開発中)
お問い合わせ

株式会社ディー・エヌ・エー

東京都渋谷区代々木4-30-3 新宿MIDWESTビル

http://dena.jp/

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【デブサミ2012】セッションレポート連載記事一覧

もっと読む

この記事の著者

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6445 2012/03/09 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング