09/09/15 21:45:53
>>746
このスレか前のスレに同じような質問があった気がする
749:デフォルトの名無しさん
09/09/15 21:46:04
>>746
URLリンク(d.hatena.ne.jp)
なんだが・・・あるぇー、文字列連結ってコンパイル時にStringBufferだか
StringBuilderに置き換えられてなかったっけ?
750:デフォルトの名無しさん
09/09/15 21:48:36
>>749
そうだよな
でも、このhatena記事みると、あれー?って感じだなw
751:デフォルトの名無しさん
09/09/15 21:51:14
コンパイラの最適化オプション-Oとかで結構変わったりするかもな
最新のは最適化オプションがデフォルトで入るときいたこともあるが
752:デフォルトの名無しさん
09/09/15 21:53:55
そりゃループの中で毎回 str += s; してるからだろ
str += s; は str = new StringBuilder(str).append(s).toString(); みたいなことになるから無駄だらけ
753:デフォルトの名無しさん
09/09/15 21:58:13
>>752
つまりはnewしてるのがオーバーヘッドの要因ってこと?
じゃあ、>>746のような+をつなげたような書き方なら
str.append(str.group(1)).append(str.group(2)).....
な感じになって、あんまり変わらない?
754:デフォルトの名無しさん
09/09/15 22:15:56
>>753
途中で定数文字列の足し算が複数回続くとか無い限り、
変わらないと思っていい。
ただ、言語仕様上は別に+演算子は二つのStringオブジェクトの
内容をくっつけたStringオブジェクトを新規作成する、
とだけで別にStringBuilderを絶対に使う、とは書いてないんだよねえ。
URLリンク(java.sun.com)
755:デフォルトの名無しさん
09/09/15 22:20:32
何回「+」でつなげるかってーのは(あまり)重要じゃない。
Stringのインスタンスが何回生まれるかってことが大事。
756:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/15 22:30:39
>>756
すばらしい
逆コンパイルすることで、わかりやすく解析できるな
やっぱnewの連発(インスタンス生成)が問題なんだな
758:デフォルトの名無しさん
09/09/15 22:34:25
このへんはコンパイラ依存
759:デフォルトの名無しさん
09/09/15 22:35:38
C++で作ったコンパイラはやっぱり安心できる
760:デフォルトの名無しさん
09/09/15 22:52:08
8 new java.lang.StringBuilder [18]
これ自体は10ナノ秒/一回程度のコストだから
文字列連結処理全体から見た場合の影響度はきわめて小さい
23 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
問題なのはこれが繰り返されること
761:デフォルトの名無しさん
09/09/15 22:57:30
>>760
なるほど、いっかいいっかい、Stringオブジェクトへ変換
(新規Stringオブジェクトを生成してる)がまずいのか
762:デフォルトの名無しさん
09/09/15 23:44:21
まずかどうかは状況次第
10回程度連結しようが普通のアプリじゃオーバヘッドにはならんよ
763:デフォルトの名無しさん
09/09/15 23:48:01
StringとStringBuilderの間で文字データを何度もやりとりしてるのが大きいんじゃないかなぁ
StringからStringBuilderへ文字データをコピー、StringBuilderからStringへ文字データをコピー・・・
文字列が長くなるほどつらい
764:デフォルトの名無しさん
09/09/16 00:03:56
java.nio.*が利用出来ない環境で、その実行環境でサポートされている
エンコーディング(ISO-2022-JPやEUC-JPなど)の一覧を取得する方法は
ありませんか?
具体的にはjava.nio.charset.Charset#availableCharsets()相当の情報を
取得する方法が知りたいです。
765:デフォルトの名無しさん
09/09/16 01:33:02
sunのjavacはコンパイル時の最適化はあんまりしない。
JITとかにまかせる方。
766:デフォルトの名無しさん
09/09/16 02:15:59
jadの入手先が見つかりません。
767:デフォルトの名無しさん
09/09/16 02:32:48
googleの一番上に出てくるけど?
768:デフォルトの名無しさん
09/09/16 02:37:52
ありがとう、見つかりました。