Subversion入門
ようやくSubversionの導入に向けた作業に着手しました。CVSもそうでしたが、こういうツールは、ユーザー教育が大事なんですよね。というわけで、本を買いました。
Subversion実践入門?達人プログラマに学ぶバージョン管理
- 作者: Mike Mason,でびあんぐる
- 出版社/メーカー: オーム社
- 発売日: 2005/08
- メディア: 単行本
- 購入: 2人 クリック: 126回
- この商品を含むブログ (65件) を見る
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()はそんなに速くないですね。
hatenabarがFirefox 1.5に対応
文字列連結のスピード
via オレンジニュース
- StringBuilder と += による文字列連結の速度比較 @ Landscape - エンジニアのメモ
同じ事をJavaで試してみました。
環境は、
+=演算子による連結、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の関係は、VectorとArrayList、HashtableとHashMapの関係と同じということですね。
あと、C#のStringBuilderはスレッドセーフなので、混同しないように。
String#concat()が意外と速いのは驚きでした。メモリ消費も少そうな感じですね。(id:hyperash:20051205で修正版を書きました)
追記
こんな情報も見つけてしまいました。またまた悩ましい・・・。
- パフォーマンスの迷信: "a" + "b" 対 StringBuffer("a").append("b") @ ブログ: 岡崎 - Okazaki's blog
個人的には、このような些細なパフォーマンスアップテクニックを身につけるよりは、ソースコードの可読性を向上させ、パフォーマンスチューニングはコンパイラに任せるというスタンスがやはり正しいでしょうし、特に最近はコンパイラに任せきりでも十分なような気がします(状況によりますが・・ ;-<
その「状況による」チューニングばかりしている今日この頃 :-(
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
ライセンスの関係で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の電卓機能が強化され、「人生、宇宙、すべての答え」を計算させると、答えが出るようになったそうです。
続きを読む