14

以下の入力ファイルを読み取る2つの方法の間にパフォーマンスに関して違いがあるかどうかを知っている人はいますか? ありがとう。

1) スキャナーとファイルでファイルを読み込む

Scanner input = new Scanner(new File("foo.txt"));

2) InputStreamReader と FileInputStream を使用したファイルの読み取り

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));
4

3 に答える 3

9

最初のポイントは、これらのコード サンプルのどちらもファイルを読み取らないということです。これは大袈裟で間違っているように聞こえるかもしれませんが、本当です。彼らが実際に行うことは、読み取りのためにファイルを開くことです。そして、それらが実際に何をするかという点では、おそらくそれぞれの効率に大きな違いはありません.

ファイルを実際に読み取る場合、使用する最適な方法は、ファイルの内容、インメモリ アルゴリズムのためにデータをどのような形式にする必要があるかなどによって異なりますScanner。 raw Reader、パフォーマンスの観点から、さらに重要なことには、コードの信頼性と保守性を高めるという観点から。

最後に、これがコードの全体的なパフォーマンスに大きな違いをもたらさない可能性があります。私が言いたいのは、アプリケーションを時期尚早に最適化しているということです。現時点ではパフォーマンスを無視して、コードの残りの部分をより単純にするバージョンを選択する方が賢明です。アプリケーションが動作しているときは、代表的な入力データを使用してプロファイリングします。プロファイリングは、ファイルの読み取りに費やされた時間を、絶対的に、アプリケーションの残りの部分と比較して示します。これにより、ファイルの読み取りを最適化する努力をする価値があるかどうかがわかります。

私が提供する唯一のパフォーマンスに関するアドバイスは、バッファリングされていない入力ストリームまたはリーダーからの文字単位の読み取りは非効率的であるということです。ファイルをそのように読み取る必要がある場合は、スタックに BufferedReader を追加する必要があります。

于 2012-04-09T00:53:14.967 に答える
4

違いと主な理由は、BufferedReader/InputStreamReader を使用すると、必要に応じてドキュメント全体を 1 文字ずつ読み取ることができることです。スキャナでは、これは不可能です。これは、InputStreamReader を使用すると、ドキュメントのコンテンツをより細かく制御できることを意味します。;)

于 2012-04-09T00:13:13.347 に答える
4

パフォーマンスに関しては、少なくとも私の経験からすると、スキャナーは間違いなく遅いものです。巨大なデータ ブロックを読み取るのではなく、解析用に作成されています。十分な大きさのバッファーを備えた InputStreamReader は、BufferedReader と同等のパフォーマンスを発揮できます。これは、辞書リストから読み取る場合、スキャナーよりも数倍高速であることを覚えています。BufferedReader と InputStreamReader の比較を次に示します。BufferedReader は Scanner より数倍速いことに注意してください。

于 2012-04-09T00:28:35.417 に答える