質問

がgooglingには、利用 java.io.File#length() ゆっくりする事ができます。FileChannelsize() る方法を行う事も可能です。

があるので効率的なjavaのファイルの大きさはどれくらいですか?

役に立ちましたか?

解決

でも測ってみましたので、以下のコード:

のための運=1反復=1のURLが最速で最も時代後ます。私はこの一部停止新鮮約10倍です。いつでもアクセス用のURLはインターネットには想像もつかなかを考えることができる:

LENGTH sum: 10626, per Iteration: 10626.0

CHANNEL sum: 5535, per Iteration: 5535.0

URL sum: 660, per Iteration: 660.0

のために毎=5および反復=50に絵を描く異なります。

LENGTH sum: 39496, per Iteration: 157.984

CHANNEL sum: 74261, per Iteration: 297.044

URL sum: 95534, per Iteration: 382.136

ファイルのキャッシュの電話ファイルシステムがチャンネルのURLにあるオーバーヘッド。

コード:

import java.io.*;
import java.net.*;
import java.util.*;

public enum FileSizeBench {

    LENGTH {
        @Override
        public long getResult() throws Exception {
            File me = new File(FileSizeBench.class.getResource(
                    "FileSizeBench.class").getFile());
            return me.length();
        }
    },
    CHANNEL {
        @Override
        public long getResult() throws Exception {
            FileInputStream fis = null;
            try {
                File me = new File(FileSizeBench.class.getResource(
                        "FileSizeBench.class").getFile());
                fis = new FileInputStream(me);
                return fis.getChannel().size();
            } finally {
                fis.close();
            }
        }
    },
    URL {
        @Override
        public long getResult() throws Exception {
            InputStream stream = null;
            try {
                URL url = FileSizeBench.class
                        .getResource("FileSizeBench.class");
                stream = url.openStream();
                return stream.available();
            } finally {
                stream.close();
            }
        }
    };

    public abstract long getResult() throws Exception;

    public static void main(String[] args) throws Exception {
        int runs = 5;
        int iterations = 50;

        EnumMap<FileSizeBench, Long> durations = new EnumMap<FileSizeBench, Long>(FileSizeBench.class);

        for (int i = 0; i < runs; i++) {
            for (FileSizeBench test : values()) {
                if (!durations.containsKey(test)) {
                    durations.put(test, 0l);
                }
                long duration = testNow(test, iterations);
                durations.put(test, durations.get(test) + duration);
                // System.out.println(test + " took: " + duration + ", per iteration: " + ((double)duration / (double)iterations));
            }
        }

        for (Map.Entry<FileSizeBench, Long> entry : durations.entrySet()) {
            System.out.println();
            System.out.println(entry.getKey() + " sum: " + entry.getValue() + ", per Iteration: " + ((double)entry.getValue() / (double)(runs * iterations)));
        }

    }

    private static long testNow(FileSizeBench test, int iterations)
            throws Exception {
        long result = -1;
        long before = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            if (result == -1) {
                result = test.getResult();
                //System.out.println(result);
            } else if ((result = test.getResult()) != result) {
                 throw new Exception("variance detected!");
             }
        }
        return (System.nanoTime() - before) / 1000;
    }

}

他のヒント

のベンチマークされたGHad対策の他にもたくさんのものなど、反射、スをインスタンス化です。 ほかの長さです。した場合を除くこれらのものを一つに電話を取得し番号は、予約確認メールに記載マイクロ秒単位:

   file sum___19.0, per Iteration___19.0
    raf sum___16.0, per Iteration___16.0
channel sum__273.0, per Iteration__273.0

100、10000回取得します:

   file sum__1767629.0, per Iteration__1.7676290000000001
    raf sum___881284.0, per Iteration__0.8812840000000001
channel sum___414286.0, per Iteration__0.414286

かったので、下記の変更コードを引数としての名前100MBファイルです。

import java.io.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;

public class FileSizeBench {

  private static File file;
  private static FileChannel channel;
  private static RandomAccessFile raf;

  public static void main(String[] args) throws Exception {
    int runs = 1;
    int iterations = 1;

    file = new File(args[0]);
    channel = new FileInputStream(args[0]).getChannel();
    raf = new RandomAccessFile(args[0], "r");

    HashMap<String, Double> times = new HashMap<String, Double>();
    times.put("file", 0.0);
    times.put("channel", 0.0);
    times.put("raf", 0.0);

    long start;
    for (int i = 0; i < runs; ++i) {
      long l = file.length();

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != file.length()) throw new Exception();
      times.put("file", times.get("file") + System.nanoTime() - start);

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != channel.size()) throw new Exception();
      times.put("channel", times.get("channel") + System.nanoTime() - start);

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != raf.length()) throw new Exception();
      times.put("raf", times.get("raf") + System.nanoTime() - start);
    }
    for (Map.Entry<String, Double> entry : times.entrySet()) {
        System.out.println(
            entry.getKey() + " sum: " + 1e-3 * entry.getValue() +
            ", per Iteration: " + (1e-3 * entry.getValue() / runs / iterations));
    }
  }
}

すべてのテストケースのウェブサイトに記載のある欠陥のあるとしてもっと早く上げることができ、同じファイルはそれぞれの方法を試みた。ではディスクキャッシングキックを試験2-3恵ます。と思っていたテストケースによるGHAD変更の順に列挙する。

みた結果だと思います。length()は変化します。

めの試験を順に出力されます。きもの時間をカスタマが多岐にわたり死刑執行がファイルです。Length()ない場合は、発生初のディスクアクセスです。

---
LENGTH sum: 1163351, per Iteration: 4653.404
CHANNEL sum: 1094598, per Iteration: 4378.392
URL sum: 739691, per Iteration: 2958.764

---
CHANNEL sum: 845804, per Iteration: 3383.216
URL sum: 531334, per Iteration: 2125.336
LENGTH sum: 318413, per Iteration: 1273.652

--- 
URL sum: 137368, per Iteration: 549.472
LENGTH sum: 18677, per Iteration: 74.708
CHANNEL sum: 142125, per Iteration: 568.5

私が修正コード用ファイルにアクセスによる絶対パスではなく、資源を取得します異なる結果(1、1の繰り返し、100,000バイトのファイル--回10バイトのファイルされているものがあります。100,000バイト)

長和:33、繰り返し処理:33.0

チャンネル和:3626、繰り返し処理:3626.0

URL和:294、繰り返し処理:294.0

応rgrigのベンチマークのかかった時間の開閉のFileChannel&RandomAccessFileインスタンスのニーズを考慮に入れることになって、これらのクラスオストリームを読み込むためのファイルです。

修正後には、ベンチマークで、私はこれらの結果は1回に85MBファイル:

file totalTime: 48000 (48 us)
raf totalTime: 261000 (261 us)
channel totalTime: 7020000 (7 ms)

10000系繰り返し同じファイル:

file totalTime: 80074000 (80 ms)
raf totalTime: 295417000 (295 ms)
channel totalTime: 368239000 (368 ms)

が必要なのは、ファイルサイズ、ファイルです。length()は、最速のについて教えてください。ご利用くださいファイルのその他の目的のように読み書きができるよう丁寧に指導しRAFがより良いベット。あなたのファイルの接続:-)

import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.Map;

public class FileSizeBench
{    
    public static void main(String[] args) throws Exception
    {
        int iterations = 1;
        String fileEntry = args[0];

        Map<String, Long> times = new HashMap<String, Long>();
        times.put("file", 0L);
        times.put("channel", 0L);
        times.put("raf", 0L);

        long fileSize;
        long start;
        long end;
        File f1;
        FileChannel channel;
        RandomAccessFile raf;

        for (int i = 0; i < iterations; i++)
        {
            // file.length()
            start = System.nanoTime();
            f1 = new File(fileEntry);
            fileSize = f1.length();
            end = System.nanoTime();
            times.put("file", times.get("file") + end - start);

            // channel.size()
            start = System.nanoTime();
            channel = new FileInputStream(fileEntry).getChannel();
            fileSize = channel.size();
            channel.close();
            end = System.nanoTime();
            times.put("channel", times.get("channel") + end - start);

            // raf.length()
            start = System.nanoTime();
            raf = new RandomAccessFile(fileEntry, "r");
            fileSize = raf.length();
            raf.close();
            end = System.nanoTime();
            times.put("raf", times.get("raf") + end - start);
        }

        for (Map.Entry<String, Long> entry : times.entrySet()) {
            System.out.println(entry.getKey() + " totalTime: " + entry.getValue() + " (" + getTime(entry.getValue()) + ")");
        }
    }

    public static String getTime(Long timeTaken)
    {
        if (timeTaken < 1000) {
            return timeTaken + " ns";
        } else if (timeTaken < (1000*1000)) {
            return timeTaken/1000 + " us"; 
        } else {
            return timeTaken/(1000*1000) + " ms";
        } 
    }
}

またこのとする。ためのファイルサイズを取得し、更新した日付90,000ファイル共有ネットワーク.Javaを利用して、しばしば取り組んで頂きたいと思います。(いからURLを取得しますファイルのパスのオブジェクトです。その多様や、時間以上.) その後、いつも使ってネイティブWin32実行可能で、かつ同じタスクは、ダンピングのファイルパス、または変更とサイズのコンソールで実行されるJava.の速度でした。ネイティブの過程で、私の文字列を扱うためのデータ処理が可能で1000項目です。

でも下位にランク以上のコメントが有効な解決、解決の私の課題です。私の場合ことは知っているフォルダもののサイズの前に、私はパスのコマンドラインを私のwin32アプリです。行ったから時間に処理ディレクトリを分。

の問題かったりするWindows固有のものです。OS Xなっているとともに、同誌掲載号の注目がアクセスネットワークファイルの情報を検索したい単語を入力して下OSがいます。

Javaファイルの取り扱いWindowsしています。ローカルディスクにアクセスのためのファイルですが。またぐネットワーク株式による、凄ます。Windowsが取得し情報ネットワーク上の共有、計算の合計サイズの下に分です。

--ベン

ご希望の場合はファイルサイズのファイルを複数のファイルのディレクトリでは、利用 Files.walkFileTree.を得ることができるサイズから BasicFileAttributes ることができます。

このはなく、あまり .length() の結果 File.listFiles() または使用 Files.size() の結果 Files.newDirectoryStream().私のテストケースで約100倍になります。

実は、と思い、"ls"可能になります。ありのいくつかの問題Javaを扱うファイル情報残念ながら同等の安全法の再帰的lsします。(cmd.exe's DIR/Sでの混乱や誤りの無限ループ)

XP、アクセス、サーバー、LAN、5秒Windowsでのカウントのファイルフォルダ(33,000)の合計サイズです。

私が再帰的に繰り返し処理を実行してこのJava、私5分です。開始していますの測定に時間がかかるなファイルです。length()ファイルです。lastModified()は、ファイルです。toURI()やかで、99%の時その3。3呼んだ...

の差を1000ファイルは、15ms地域に対し1800msにサーバーです。サーバーのパスに走査Javaはォ遅くなります。場合はネイティブのOSできる高速で走査することと同じフォルダができないのはなぜでJava?

することにより完全試験を使ってWineMerge XPに比較し、変更日時、サイズのファイルをサーバーとのファイル。この繰り返し処理を行全体のディレクトリツリーの33,000ファイルの各フォルダにまとめた。総時間7秒です。java:5分です。

その原文と質問からOPはtrue、無効です。そのが目立たなくなります。を取り扱う場合には地元のファイルシステム。という地域を比較し、フォルダ33,000項目間は3秒にWinMerge、32秒を現地でJava.でも、javaとネイティブは10倍の減速にこれらの基礎試験までを実施。

Java1.6.0_22(最新版),ギガビットLANネットワーク接続ピングとは、以下1ms(両方のスイッチ)

Javaが遅くなります。

からGHadのベンチマークでは、いくつかの問いについて

1>のようにBalusCについてストリームです。available()が流れます。

が利用可()を返します。 の見積り のバイト数を読み込むことができる(またはスキップからこのブロックせずに入力ストリームの次の呼び出しの方法この入力ストリームです。

その1のURLです。

2>のとしてStuartH記の順に試運転またはキャッシュの違いうことによるテストを実行します。


開始試験:

が、シャネル単独で走らせ:

CHANNEL sum: 59691, per Iteration: 238.764

が発表され単独で走らせ:

LENGTH sum: 48268, per Iteration: 193.072

そのように見え、長さの受賞者はこちら

@Override
public long getResult() throws Exception {
    File me = new File(FileSizeBench.class.getResource(
            "FileSizeBench.class").getFile());
    return me.length();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top