かなり概出な話

この話は、Javaを知らないと全く分かりません。読み飛ばしてください。それと、Javaにある程度精通してる方も、基本的に読み飛ばしてください。多分、L.O.Nなら「そんなん、知ってるよ」と言いかねない話ですし、実際そこらへんに転がっている話です。
最近、性能測定検証プログラム……具体的に書くと、ある形式でファイルを用意して、それに対して全件検索を実施するプログラムをJavaで作成して、件数と速度を計るプログラムです。ま、どこにでもある話ですね。「そんなの、新人にやらせろよ」と、突っ込みが入るかもしれませんが、そもそもJavaのコードが組めて、手早くアサインできたのが自分しかいなかったので、やっていたと言うわけ。
でもって、XML(これは、以前あったので件数を変えて計りなおし)とシーケンシャル型データベース(Javaのドキュメントが皆無に近い状態から、先人の力を借りて泣きながら作った)にの2本を作って、性能を検証して資料をまとめたのですが、昨日になって「CSV形式でも同じくやってみてくれ」と依頼が。まぁ、これも非常によくある話ですね。
で、早速プログラムに着手。一応手元に外部接続PCがあるので、ちょこっとだけ調べてからさくっとプログラム完了。プログラム動作検証用のデータを噛ませてみると……なんか、うまく行かない。1レコードで取れるべきフィールド数も合わない(CSVなので、1レコードに格納されているフィールド数も決まってるから、これはすぐ分かる)。
どうも、使っているクラス(java.util.StringTokenizer)のコンストラクタに渡す引数が悪いっぽく、これの引数を変えれば解決……とはいかない。動きをイメージで言うと、1つの区切り文字単位で処理をするので、全部読み込ませるためにループ処理が必要になります。そう、このループ処理が曲者で、レコードが多くなればなるほど、そして件数が増えれば増えるほど処理は掛け算効果で劣化するのです。
で、もう少し調べて見たら……ありました、ぴったりなのが。Java 1.4から実装されているんですが、java.lang.Stringクラスにsplitというメソッドが増えています。このメソッド、先述のパターンだと1個1個区切り文字を見っけて処理するイメージなのですが、こっちは1行単位で区切り文字を見つけて一気に切り刻むようなメソッドなのです。これを利用する手はありません。これに切り替えたら、アホなくらいあっさり処理が終了。それも、ピンポイントで引っこ抜いてちゃんと取れているかどうかを検証しても、ちゃ〜んと取れているんです。なんかしらんうちに、Javaは進化したものです(w

で、性能検証をやって結果報告をしたら、同じような反応が返ってきました。「そんなメソッド知らない」と言ってましたし(実際、Java 1.4からの実装だから1、2年離れているとそうなのかもしれませんね)。本当、今日はふたつ賢くなりました。そのもう1個は……実際にやって成功しないと書けないと思われるorz

万が一、こういうプログラミング的に面白いことがあったら、超絶に気が向いたら書き込んでみようかなと思います。一応、自分のマシンにVB2005(Express)とEclipse3.2入ってるから、なんかあったらすぐに試せるし。