ブログ移転しました!!

スクリプト着手中です。久しぶりに技術の話なども。

takasuga_chara_picture
ゲーム制作サークル「LR」代表、タカスガタイキです。



現在、パッチの制作工程はスクリプト実装まで進みました。
ただ、まだ終わっていません。

以前の日記で、リリース時期が二月中旬頃に変更になった旨、ご報告しました。
中旬というからには、11日~20日の間。
頃という指定の曖昧さを好意的に解釈したところで、せいぜい21、22あたりが限度でしょう。

まあ、組み込み作業自体はfixできるのかなと思っています。
けれど、テスト工程がはみ出やしないかと心配です。

「こりゃテストに使う期間が足りない」

と僕が判断したら、次の日記辺りでリリース時期を再設定させていただくかもしれません。








さて、プログラマらしく、たまにはコードについてでも語ってみたいと思います。
僕はおもとしてJAVA屋なんで、JAVAについての話題など。


この前、後輩に

「String型で文字列を連結させるより、StringBufferで文字列を連結させる方が良いのは何故か」

と質問されたんですよ。
その時は、

「String型は文字列を定数で持つが、StringBufferは可変だから」

くらいのふわっふわした回答しかできなかったのですけど。
気になってちょっとググってみました。

たとえば以下のようなコードがあったとします。


//sample
String str = "hoge" + "fuga";
return str;


これは、内部で以下のように変換されます。


//sample_after
String str = new StringBuffer("hoge").append("fuga").toString();
return str;


StringBufferクラスのtoString()メソッドの中では、StringBufferのフィールド変数valueを詰めたStringインスタンスをnewしています。
つまり、たとえば、


//sample2
String str = "hoge";
str = str + "fuga";
str = str + "piyo";
return str;


というコードは、内部的には、


//sample2_after
String str = new StringBuffer("hoge").toString();
str = new StringBuffer(str).append("fuga").toString();
str = new StringBuffer(str).append("piyo").toString();
return str;


に変換されるため、StringBufferインスタンスが三つ、そのStringBufferインスタンスのtoString()メソッドによってStringインスタンスが三つの計六つのインスタンスがnewされてしまいます。

対して、StringBufferを使って書いた場合は、以下の通り。


//sample2_case_stringbuffer
StringBuffer sb = new StringBuffer("hoge");
sb.append("fuga");
sb.append("piyo");
return sb.toString();


こうすると、newするStringBufferとStringのインスタンスはそれぞれ一つずつになります。
単純計算で戦力は三倍差です。
for文の中をくるくる舐めて、文字列をひたすら連結するような処理をすると、この差が如実に現れるようになります。
なので、明示的にStringBufferでappendさせた方が、メモリの消費が少なく、実行速度が速まるのですね。

三倍。。三倍。。。

要は、赤くて角が生えちゃうってことか!!!









すみません、無理矢理オチにしました。




=================================
所属 : ゲーム制作サークル「LR」
実績 : 発掘少女

タカスガタイキ
=================================
関連記事
スポンサーサイト



web拍手 by FC2

Pagination