- 1 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 20:02:41 ]
- プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 ttp://pc11.2ch.net/hp/ Webプログラミング ttp://pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 ttp://www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド131【歓迎】 ttp://pc12.2ch.net/test/read.cgi/tech/1250369910/ 次スレは>>950あたりで。 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 ttp://www.wikiroom.com/java/
- 752 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 21:53:55 ]
- そりゃループの中で毎回 str += s; してるからだろ
str += s; は str = new StringBuilder(str).append(s).toString(); みたいなことになるから無駄だらけ
- 753 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 21:58:13 ]
- >>752
つまりはnewしてるのがオーバーヘッドの要因ってこと? じゃあ、>>746のような+をつなげたような書き方なら str.append(str.group(1)).append(str.group(2))..... な感じになって、あんまり変わらない?
- 754 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:15:56 ]
- >>753
途中で定数文字列の足し算が複数回続くとか無い限り、 変わらないと思っていい。 ただ、言語仕様上は別に+演算子は二つのStringオブジェクトの 内容をくっつけたStringオブジェクトを新規作成する、 とだけで別にStringBuilderを絶対に使う、とは書いてないんだよねえ。 java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1.2
- 755 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:20:32 ]
- 何回「+」でつなげるかってーのは(あまり)重要じゃない。
Stringのインスタンスが何回生まれるかってことが大事。
- 756 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:26:07 ]
- jadで確認してみた。
String tmp = ""; for (int i=0; i<100; i++) { tmp = tmp + i; } すると、ループ内で毎回StringBuilderをtmpで作って、i入れて、toStringした 結果を、tmpに入れてる。 0 ldc <String ""> [16] 2 astore_1 [tmp] 3 iconst_0 4 istore_2 [i] 5 goto 30 8 new java.lang.StringBuilder [18] 11 dup 12 aload_1 [tmp] 13 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [20] 16 invokespecial java.lang.StringBuilder(java.lang.String) [26] 19 iload_2 [i] 20 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29] 23 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33] 26 astore_1 [tmp] 27 iinc 2 1 [i] 30 iload_2 [i] 31 bipush 100 33 if_icmplt 8 最適化しないのね。
- 757 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:30:39 ]
- >>756
すばらしい 逆コンパイルすることで、わかりやすく解析できるな やっぱnewの連発(インスタンス生成)が問題なんだな
- 758 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:34:25 ]
- このへんはコンパイラ依存
- 759 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:35:38 ]
- C++で作ったコンパイラはやっぱり安心できる
- 760 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:52:08 ]
- 8 new java.lang.StringBuilder [18]
これ自体は10ナノ秒/一回程度のコストだから 文字列連結処理全体から見た場合の影響度はきわめて小さい 23 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33] 問題なのはこれが繰り返されること
- 761 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 22:57:30 ]
- >>760
なるほど、いっかいいっかい、Stringオブジェクトへ変換 (新規Stringオブジェクトを生成してる)がまずいのか
- 762 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 23:44:21 ]
- まずかどうかは状況次第
10回程度連結しようが普通のアプリじゃオーバヘッドにはならんよ
- 763 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 23:48:01 ]
- StringとStringBuilderの間で文字データを何度もやりとりしてるのが大きいんじゃないかなぁ
StringからStringBuilderへ文字データをコピー、StringBuilderからStringへ文字データをコピー・・・ 文字列が長くなるほどつらい
- 764 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 00:03:56 ]
- java.nio.*が利用出来ない環境で、その実行環境でサポートされている
エンコーディング(ISO-2022-JPやEUC-JPなど)の一覧を取得する方法は ありませんか? 具体的にはjava.nio.charset.Charset#availableCharsets()相当の情報を 取得する方法が知りたいです。
- 765 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 01:33:02 ]
- sunのjavacはコンパイル時の最適化はあんまりしない。
JITとかにまかせる方。
- 766 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 02:15:59 ]
- jadの入手先が見つかりません。
- 767 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 02:32:48 ]
- googleの一番上に出てくるけど?
- 768 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 02:37:52 ]
- ありがとう、見つかりました。
|

|