[android-group-japan: 4100] String.Formatが遅い?

974 views
Skip to first unread message

Shigeo Mutoh

unread,
May 13, 2010, 5:40:08 AM5/13/10
to android-g...@googlegroups.com
 武藤です。

 一人で開発しているので、面白い問題を誰にも話せなくてつらくなって
きたので、書かせてください。


 作ったアプリを試すため、ちょっと一泊二日でテスト旅行に出かけます。
それでノートPCに開発環境の準備をしました。emulatorでデバッガをかけると、
Core2Duoのcpuのうち1個が、完全に天井に貼り付き続けるほど負荷が高いこと
に気がつきました。実際、モッサロイドどころか、カタマッタロイドてな
感じでした。(Menuの反応が30秒ぐらいかかる)

 普段はCore-i7を使ってるため気がつかなかったようです。
プロファイラのようなものを準備する前に、ビシバシbreakさせてみると、
String.Formatが犯人だとわかりました。

 処理させている内容は10個ほどの%.桁数fを含んだ処理で、約1秒に1回です。
実際のコードはこんな感じです。

String postData = String.format(
"uid=%s&curspd=%.2f&maxspd=%.2f&lat=%.10f&lon=%.10f&....続く

その処理をやめるとcpu負荷は20%程度となり正常となりました。
どうやらこの処理だけで1秒近く掛かっている様子。

そんな経験、みなさんにもありませんか? 思わぬところで落とし穴が...
みたいな。

 実機ではそういう印象はないので、とりあえず見なかったことにしても
良いのですが、十中八九、本当にそれは遅いんだろうと思っているので、
これから解決に挑みます。さてどうやって??

 本来ならJDKのソースを入れてじっくり眺めたいところですが今は
適当にあてずっぽうで対応してみようかと思います。

 あ、そんなのjavaの人なら常識ですか? ごめんなさい。。

--
Shigeo Mutoh <tmh...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

飯塚康至(エイシーエル)

unread,
May 13, 2010, 5:52:15 AM5/13/10
to 日本Androidの会
こんんちは!飯塚です。

私も以前Stringははまりました。

Stringは文字列定数なので、変更がある度にインスタンスを作りなおします。
Androidのアプリの中でループ等で文字列を処理するとGCが頻発し特に遅くなります。

以降、意識してStringBilderを使うようにしています。
フォーマットだとこのへんでしょうか。
http://www.itarchitect.jp/technology_and_programming/-/21161.html

みゅおさんの翻訳も役に立つと思います。「効率的なAndroid用コードを書くには」
http://www.muo.jp/android/?toolbox/performance.html
> Shigeo Mutoh <tmho...@gmail.com>

Shigeo Mutoh

unread,
May 13, 2010, 6:09:41 AM5/13/10
to android-g...@googlegroups.com
 武藤です。

 飯塚さん、ありがとうございます。

飯塚康至(エイシーエル) <vse...@gmail.com> wrote:
> Stringは文字列定数なので、変更がある度にインスタンスを作りなおします。

 わかっちゃいるけどヤメラレナイ。。
 ただ今回、暗黙の new String はformat文字列ただ1個だけだと思うので、
それが原因ではないと思うのですよね。たぶん、Formatメソッドの中で相当困った
コードが書いてあるのだろう、こんにゃろめー、と思ってるんですが、よくよく
調べると、たぶん僕が謝ることになるかと思います。(99%そういうパターンです...)

> Androidのアプリの中でループ等で文字列を処理するとGCが頻発し特に遅くなります。
>
> 以降、意識してStringBilderを使うようにしています。

 おお、それっ! ナイスです。もっと勉強しないと。
 早速のお返事ありがとうございました。

--
Shigeo Mutoh <tmh...@gmail.com>

Shigeo Mutoh

unread,
May 13, 2010, 6:49:25 AM5/13/10
to android-g...@googlegroups.com
 武藤です。

 StringBuilderをメンバー変数にして必要サイズ確保しておき、
逐一setLengthでクリアして使えば、仰天の速度アップとなりました。
floatの小数点桁制限はもはやどうでも良いということで。
また固定文字列は全部finalを付けました。

// String.formatなんて二度と使うもんか!
String postData;
final String c_amp = "&";
final String c_uid = "uid=";
final String c_curspd = "curspd=";
final String c_maxspd = "maxspd=";
.......
StringBuilder tmp = m_postDataBuilder;
tmp.setLength(0);
tmp.append(c_uid); tmp.append(uid); tmp.append(c_amp);
tmp.append(c_curspd); tmp.append(loc.getSpeed()); tmp.append(c_amp);
tmp.append(c_maxspd); tmp.append(maxSpeed); tmp.append(c_amp);
.......
postData = tmp.toString();
return(postData);

--
Shigeo Mutoh <tmh...@gmail.com>

yamada masaki

unread,
May 14, 2010, 1:18:35 AM5/14/10
to android-g...@googlegroups.com
StringBuilderなんてのがあるんですね

「StringBuilderか…なかなかのパワーとスピードだこのDIOが生まれた時代はStringBufferしかなかった」

手っ取り早く最新のjava動向に追いつくにはどうしたら良いんだろう・・・


2010年5月13日19:49 Shigeo Mutoh <tmh...@gmail.com>:

tomoki yamashita

unread,
May 14, 2010, 5:03:17 AM5/14/10
to android-g...@googlegroups.com
やましたです。

てっとりばやいかは分からないですが、私はjava5の新機能についてはここで学びました。

J2SE 5.0 虎の穴 Java2 SE v5.0 Tiger の新機能
http://www.javainthebox.net/laboratory/J2SE1.5/contents.html

分かりやすいでしたよ。
java6の新機能はあまり分からないです。。。



2010年5月14日14:18 yamada masaki <mas...@hisme.net>:
--
/*
tomoki yamashita
tomor...@gmail.com
http://twitter.com/tomorrowkey
http://d.hatena.ne.jp/tomorrowkey/
*/
Reply all
Reply to author
Forward
0 new messages