Maven 2.X Plugin for Eclipse

via オレンジニュース

インストール手順は、以下のような感じで。
「ヘルプ(H)」
→「ソフトウェア更新(U)」
→「検索とインストール(F)...」
→「インストールする新規フィーチャーを検索(S)」&「次へ(N)>」
→「新規リモート・サイト(T)...」でURLに"http://m2eclipse.codehaus.org/"を指定。

Subversion入門

ようやくSubversionの導入に向けた作業に着手しました。CVSもそうでしたが、こういうツールは、ユーザー教育が大事なんですよね。というわけで、本を買いました。

Subversion実践入門?達人プログラマに学ぶバージョン管理

Subversion実践入門?達人プログラマに学ぶバージョン管理

EclipseユーザーはSubclipseプラグインを入れればCVSと同じインターフェースで使えるので、あまり違いを意識せずにすみそうですね。あとは、VSSやWinCVSユーザー。TortoiseSVNは便利なのですが、エクスプローラに統合している故の宿命として、一覧性が悪いという欠点を抱えています。リビジョンとか、ばーっと一覧で見たいときに不便。

・・・と思って色々いじっていたら、おおっと。

SVN管理下のディレクトリでは、エクスプローラの「表示(V)」→「詳細表示の設定(C)...」から、色々な列を出せるんですね。

TortoiseSVNでいけそうです。

追記

Subversion実践入門―達人プログラマに学ぶバーンジョン管理」・・・「バージョン管理」ですよね。あーあこんなことになってる。以前の「ファンデーション」は今見たら直ってましたが・・・。

文字列連結のスピード(修正版)

前回のソースで、String#concat()を使用している部分がこうなっていました。

str_concat.concat("" + i);

これだとstr_concatには連結されませんね。
このように修正しました。

str_concat = str_concat.concat(String.valueOf(i));

nilさん、ご指摘ありがとうございました。

さて、再計測。まずは1000回。

1000 times loop.
String +=       : 00:00:00.034924830
String#concat() : 00:00:00.020945120
StringBuffer    : 00:00:00.002231848
StringBuilder   : 00:00:00.000897880

1万回。

10000 times loop.
String +=       : 00:00:05.222788651
String#concat() : 00:00:02.281017560
StringBuffer    : 00:00:00.005938185
StringBuilder   : 00:00:00.002852598

10万回。

100000 times loop.
String +=       : 01:04:14.471478917
String#concat() : 00:35:21.662596224
StringBuffer    : 00:00:00.117385869
StringBuilder   : 00:00:00.102142312

100万回。

1000000 times loop.
String +=       : (とにかく遅い)
String#concat() : (〃)
StringBuffer    : 00:00:00.611553982
StringBuilder   : 00:00:00.605492039

1000万回。

10000000 times loop.
String +=       : (とにかく遅い)
String#concat() : (〃)
StringBuffer    : (java.lang.OutOfMemoryError)
StringBuilder   : (java.lang.OutOfMemoryError)

結論。1万回以下程度ではStringBuilderは速いです。String#concat()はそんなに速くないですね。

文字列連結のスピード

via オレンジニュース

同じ事をJavaで試してみました。
環境は、

  • CPU : Pentium 4 1.70GHz
  • RAM : 1024MB
  • JVM : J2RE 1.5.0(ヒープサイズはデフォルト)

+=演算子による連結、String#concat()メソッドによる連結(あまり一般的ではないと思いますが・・・)、定石のStringBufferクラス、さらにJ2SE 5.0で加わったStringBuilderクラスも試してみました。

ソースはこれ。J2SE 5.0以降対応です。5.0の新しいSystem.nanoTime()はこういうベンチマークで便利なんですが、DateFormat等で整形できないのがなんとも・・・。

public class StringConcatenateTest
{

    public static void main(String[] args)
    {
        int times = 1000;
        System.out.println(times + " times loop.");

        // +=
        long start = System.nanoTime();
        String str = "";
        for (int i = 0; i < times; i++)
        {
            str += i;
        }
        System.out.println("String +=       : " + getNanoTimeString(System.nanoTime() - start));

        // String#concat()
        long start_concat = System.nanoTime();
        String str_concat = "";
        for (int i = 0; i < times; i++)
        {
            str_concat.concat("" + i);
        }
        System.out.println("String#concat() : " + getNanoTimeString(System.nanoTime() - start_concat));

        // StringBuffer
        long start_stringbuffer = System.nanoTime();
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < times; i++)
        {
            buffer.append(i);
        }
        System.out.println("StringBuffer    : " + getNanoTimeString(System.nanoTime() - start_stringbuffer));

    
        // StringBuilder
        long start_stringbuilder = System.nanoTime();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < times; i++)
        {
            builder.append(i);
        }
        System.out.println("StringBuilder   : " + getNanoTimeString(System.nanoTime() - start_stringbuilder));
    
    }
    
    private static String getNanoTimeString(long nanoTime)
    {
        long t = nanoTime;
        
        long nsec = t % 1000;
        t /= 1000;
        long usec = t % 1000;
        t /= 1000;
        long msec = t % 1000;
        t /= 1000;
        long sec = t % 60;
        t /= 60;
        long minute = t % 60;
        t /= 60;
        long hour = t;

        return String.format("%02d:%02d:%02d.%03d%03d%03d", hour, minute, sec, msec, usec, nsec);
      } 

}

まずは1000回のループ。

1000 times loop.
String +=       : 00:00:00.038828399
String#concat() : 00:00:00.012665577
StringBuffer    : 00:00:00.000677181
StringBuilder   : 00:00:00.000211759

1万回では、

10000 times loop.
String +=       : 00:00:05.104651569
String#concat() : 00:00:00.029140576
StringBuffer    : 00:00:00.005066845
StringBuilder   : 00:00:00.002816839

10万回

100000 times loop.
String +=       : (話にならないくらい遅い)
String#concat() : 00:00:00.112415405
StringBuffer    : 00:00:00.108727785
StringBuilder   : 00:00:00.101025968

100万回

1000000 times loop.
String +=       : (話にならないくらい遅い)
String#concat() : 00:00:00.873067666
StringBuffer    : 00:00:00.669204047
StringBuilder   : 00:00:00.593941409

1000万回

10000000 times loop.
String +=       : (話にならないくらい遅い)
String#concat() : 00:00:08.593192710
StringBuffer    : (java.lang.OutOfMemoryErrorで実行できず)
StringBuilder   : (java.lang.OutOfMemoryErrorで実行できず)

結論。StringBuilder激速。これからはStringBuilder。ただし、スレッドセーフでない点には気をつけましょう。StringBufferとStringBuilderの関係は、VectorArrayList、HashtableとHashMapの関係と同じということですね。

あと、C#のStringBuilderはスレッドセーフなので、混同しないように。

String#concat()が意外と速いのは驚きでした。メモリ消費も少そうな感じですね。id:hyperash:20051205で修正版を書きました)

追記

こんな情報も見つけてしまいました。またまた悩ましい・・・。

個人的には、このような些細なパフォーマンスアップテクニックを身につけるよりは、ソースコードの可読性を向上させ、パフォーマンスチューニングはコンパイラに任せるというスタンスがやはり正しいでしょうし、特に最近はコンパイラに任せきりでも十分なような気がします(状況によりますが・・ ;-<

その「状況による」チューニングばかりしている今日この頃 :-(

2005/12/04 追記

コメント欄で指摘を頂きまして、String#concat()の使い方を激しく間違っておりました。ベンチマークやり直しですね。

2005/12/05 追記

id:hyperash:20051205で、ベンチマークをやり直した結果を書きました。

Maven2メモ

プロジェクトの作成

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app

参考:http://maven.apache.org/guides/getting-started/index.html#How%20do%20I%20make%20my%20first%20Maven%20project?
以下のソースツリーが生成される。

my-app
│  pom.xml
│  
└─src
    ├─main
    │  └─java
    │      └─com
    │          └─mycompany
    │              └─app
    │                      App.java
    │                      
    └─test
        └─java
            └─com
                └─mycompany
                    └─app
                            AppTest.java

プロジェクトの作成(Webアプリケーション)

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

参考:http://maven.apache.org/guides/mini/guide-webapp.html
以下のソースツリーが生成される。

my-webapp
│  pom.xml
│  
└─src
    └─main
        ├─resources
        └─webapp
            │  index.jsp
            │  
            └─WEB-INF
                    web.xml

Eclipse用のproject.xmlの生成

mvn eclipse:eclipse

ライセンスの関係でmavenサーバーに収録されていないjarファイルのリポジトリへの登録

SunのJAF(Java Activation Framework)の例だと、

mvn install:install-file -DgroupId=javax.activation -DartifactId=activation -Dversion=1.0.2 -Dpackaging=jar -Dfile=activation.jar

ローカルのリポジトリに、

$M2_REPO
└─javax
    └─activation
        │      maven-metadata-local.xml
        │
        └─activation
            └─1.0.2
                    activation-1.0.2.jar
                    activation-1.0.2.pom

という形で登録される。

Googleが「生命と宇宙と万物の答え」に回答

Yahoo!JAPANのトップニュースで知ったんですが、Googleの電卓機能が強化され、「人生、宇宙、すべての答え」を計算させると、答えが出るようになったそうです。

続きを読む