トップ «前の日記(2007-09-04) 最新 次の日記(2007-09-06)» 編集

jFD開発したりしなかったり日誌

2004|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|
2007年
9月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

2007-09-05 [長年日記]

_ FastFile

ちょっと話題になったんで、Java6を使ってjava.io.FileとFastFileの

パフォーマンスを調べてみた。

指定されたディレクトリのファイル一覧を取得し、その全てに対して名称、

サイズ、種別(ファイルかディレクトリか)、読み込み可否、書き込み可否を

取得する、というコードを書いてみた。

実行結果はディレクトリのファイル数ごとに、

5000ファイル

File→0.6秒

FastFile→0.1秒

10000ファイル

File→1.2秒

FastFile→0.2秒

30000ファイル

File→3.6秒

FastFile→1.4秒

となった。

明らかにFastFileの方が速いのだが、気になるのがFastFileの結果がファイル数に

対して正比例じゃないことか。

昔はFileの結果がファイル数に対して正比例じゃなくて、二乗に比例して遅くなってたが、

それは改善されてるようだ。

_ 実際の

テストコードはこんな感じです。

レイアウトのためにスペースは全角スペースになってますんで悪しからず。

import java.io.*;

import jp.ne.anet.kentkt.fastfile.*;

 

public class FileListTest {

 public static void main(String[] args) {

   long start = System.currentTimeMillis();

   

//    File dir = new File(args[0]);

   File dir = new FastFile(args[0]);

   File[] files = dir.listFiles();

   FileInfo[] infos = new FileInfo[files.length];

   

   for(int i=0; i<files.length; i++) {

     infos[i] = new FileInfo(files[i]);

   }

   

   System.out.println(System.currentTimeMillis() - start);

 }

 

 static class FileInfo {

   String name;

   long length;

   boolean isFile;

   boolean canRead;

   boolean canWrite;

   

   FileInfo(File file) {

     name = file.getName();

     length = file.length();

     isFile = file.isFile();

     canRead = file.canRead();

     canWrite = file.canWrite();

   }

 }

}

_ 仕事

朝、DBのパフォーマンス絡みの調査依頼が来た。

三つ頼まれたうち二つを仕上げて帰宅。

残りはまた明日。

_

昼飯を食いに、Fさんと会社の近くの某ホテル最上階のレストランへ。

ここは水曜日にカレーバイキングを1000円でやっていて、ちょくちょく食べに行ってる。

東京湾が一望できてなかなか眺めのいいレストランなのだが、いきなり視界が

悪くなったと思ったら、ものすごい大雨になった。

雨が窓ガラスにビタビタと打ちつけ、霧が発生したように遠くが見えなくなった。

Fさんと

「これ、会社戻れますかね・・・」

と言いながら食事してたら、降りはじめと同じくらい急にやんで、普通に帰れるようになり

一安心した。

でもここ最近ごきぶりポーカーのやりすぎで妙に相手の裏を読む癖がついて、

「きっと雨がやんでこれでもう降らないだろう、と思わせておいて表に出たところを

また土砂降りにする気なんですよ!」

あのゲームは人を歪めるなあ。

_ jFD2

Sさんからリクエスト。

インクリメンタルサーチを改良して欲しい、との事。

自分ではあまり使わない機能だったが、理論立てて説明されて納得したので

導入決定。

次バージョン辺りで。

_ 空手社長とIさんと飲み

仕事後、新橋で空手部長改め空手社長と、以前の同僚だったIさんと飲んだ。

新橋駅に集合し、まずIさんと合流して空手社長を待つ。

さっきの雨のせいで恐ろしく湿度が高く、不快指数は凄まじい。

しばらくして空手社長が現れた。

「どこ行く?」

「とにかくエアコンがキンキンに効いた所をお願いします」

ということで駅前の居酒屋へ。

ちょっと他にめでたい事もあったので、おいしく酒を飲む。

Iさんは仕事が色々大変らしい。

なんだかなあ、な仕事。

そのほかIさんの切なくも美しいストーリーを面白おかしく聞いたり、

今までのどうしようもない仕事のリストアップをしたり。

ひたすらご機嫌で飲んでいた。

本日のツッコミ(全9件) [ツッコミを入れる]
_ K.Takata (2007-09-05 23:58)

>気になるのがFastFileの結果がファイル数に
>対して正比例じゃないことか。

メモリ管理方法による問題かも知れません。FastFile.dllはファイル名と属性の一覧をすべてメモリに読み込んでから、FastFile[]に変換して結果を返しています。一覧を読み込むためのメモリ領域は、最初に1024ファイル分確保し、足りなくなると以降1024ファイル分ずつ増やしていきます。増やす際に、領域をそのまま伸張できればいいのですが、後ろに空きがないと大量のメモリコピーが・・・。倍々で増やすようにすると改善されるかもと考えています。
(ちなみに1ファイルの情報は600バイト弱あるので、3万ファイルだと約18MB・・・アルゴリズムの見直しが必要かも?)

_ びい (2007-09-06 09:08)

メモリ確保/コピーがその程度のオーバヘッドになるか、というとディスクI/Oのほうが圧倒的に遅いのであまり影響は無いのでは。
ファイルシステム側の先読み機能との相性なんかも気になります。
DFでは「たくさんあるところにはたくさんある」という法則の下、倍々に増やしていっています。

_ Shunji (2007-09-06 20:33)

>>K.Takataさん
気が向いたら改良ご検討ください。
今のままでも普段はあまり困らないんですが、弱点が減ると嬉しいですね。

>>びいさん
ふーむ。
Javaでファイラー書いてると、けっこうそういうこと考えなくなっちゃうもんで参考になります。

_ K.Takata (2007-09-06 23:48)

FileListTestを使って計測してみました。こちらでも3万ファイル、FastFileで約1.0秒と同じような傾向でした。倍々で増やすようにしたところ、約0.4秒に改善されました。
この内、FindFirstFile()/FindNextFile()を使ってファイルの一覧を取得するのに掛かる時間は50ms程度のようです。やはり、MB単位のメモリの確保・コピーに掛かる時間は馬鹿にできません。
後は3万個のFastFileオブジェクトの生成と、配列への格納に掛かる時間が、0.2秒程度でした。

_ Shunji (2007-09-08 00:47)

メモリ確保、コピーの時間が約4分の1、というわけですか。
差は大きいですね。
ためになりますよ。

_ K.Takata (2007-09-09 22:31)

結局大量のメモリ確保をやめることで、0.3秒以下となり、File.listFiles() と同等の時間で属性も取得できるようになりました。ついでに Java 6 に対応してみました。ただ、実のところ、canRead(), canWrite(), canExecute() にはちょっと問題があったり。

インクリメンタルサーチは、最近になって自分の使っているファイラーに実装しましたが便利です。
ttp://homepage3.nifty.com/k-takata/mysoft/springm.html
日本語ファイル名を使うときは、migemo が使えると非常に便利です。数百のファイルの中から一瞬で目的のファイルにカーソルが移動するのは感動します。Java には migemo はまだ移植されてないのでしたっけ?

_ Shunji (2007-09-10 11:09)

おお、いい感じですね。
是非公開してください。
お願いします。
migemo導入は前々からしたいとは思っていたんですが、今のところJava実装は無いですね。
そろそろ誰かやらないのかな、と思ってたんですが話を聞きません。
自分でやるしかないかなあ・・・

_ K.Takata (2007-09-11 00:04)

FastFileの新バージョンは既に公開しています。NTFSでの問題点については日記に書いておきました。

_ Shunji (2007-09-11 09:58)

さっそくダウンロードしました。
これからjFD2に組み込んでみますね。

本日のリンク元
その他のリンク元
検索