主画面のプロファイル計測 - Expense Report (7)

 ソニー・エリクソンW890iExpense Reportを使っているうちに、費用項目数が多くなるごとに主画面(費用一覧画面)の費用リスト表示に時間が掛かるようになってきた。それ自体は想定の範囲内だが、50項目表示するのに7秒ほどかかっている。同じものを表示するのにノキアE51は約3秒。5秒かかるとかなり待たされる感じになる。しかも手抜きしているので、主画面へ戻る度に主画面オブジェクトを再生成している。他の画面から主画面へ戻る度に長時間待たされて、きわめて使い勝手が悪い。
 そこで、実際にどこで時間がかかっているのか、プロファイルを計測することにした。
 ソニー・エリクソンSDKバージョン2.5.0.3 *1 では、実機のCPUプロファイルを取得することができる。READMEにはJP-8(Java Platform-8 *2)以降の機種でこの機能が使えると書いてあり、ドキュメントにはJP-8.3.2以降でサポートしていると書かれている。どちらが本当か。後者が正しいのだろう。ダメモトでJP-8のW890iを試してみる。案の定、「この機種ではサポートされていない」というエラーメッセージが表示された。*3
 しかたないので、ログを出しながらExpense Reportを動かす。System.outへの出力がPCのDevice Explorer上でスクロールして行く。各処理ごとにSystem.currentTimeMillis()で取得した時刻が入っているので、ログをExcelに取り込んで処理時間を計算してみる。
 レコードストアから費用データを読み込んで日付順に並べ替えるのに70ミリ秒。各費用をListにappend()するのに最初の9項目までは各60ミリ秒、10項目目だけ800ミリ秒かかっており、これが10項目ごとに繰り返される。処理時間の大部分は画面の初期化に費やされていた。項目を一つずつappend()していく代わりに配列を引き数として受け取る方のコンストラクタを使っても、画面の初期化に要する時間は変わらなかった。*4
 画面初期化そのものに時間がかかっているので、これ自体を短縮することができない。代わりに、初期化が完了するまで待機画面を表示して、一度生成した主画面オブジェクトを繰り返し使い回すようにコードを変更しなければならない。

*1:Sony Ericsson SDK 2.5.0.3 for Java ME Platform ダウンロード

*2:ソニー・エリクソンJavaプラットフォームについては『Developers' Guidelines Java ME CLDC (MIDP 2)』や『wikipedia:en:Sony_Ericsson_Java_Platform』を参照。

*3:JP-8.3と言われている機種のうちどれがJP-8.3.2なのか明確な説明はない。CPUプロファイリングを行いたいならJP-8.4以降の機種を使うのがよさそうだ。

*4:その上、オープンアプリプレイヤーMIDP実装では後者のコンストラクタ内部からinsert()が繰り返し呼ばれる。2008年12月1日の記事に書いた問題がここでも発生してしまう。