• 締切済み

実行速度を速くする方法

javaで整数がランダムに記述されたテキストファイルを読み込み、ソートし、テキストファイルに出力させるプログラムを考えています。 テキストファイルからの読み込みはあらかじめ配列を作っておき、scannerで読み込んでいます。 アルゴリズム(バブルソート)を変更せずに実行速度を速くするにはテキストファイルの読み込みを速くしたいのですが、どのように変更すれば良いでしょうか。 ソート数としては10万くらいを考えています。 またプログラムの記述が変なところがあれば教えていただければありがたいです。 import java.io.*; import java.util.Scanner; class test1_4{ public static void main(String args[]){ long start = System.currentTimeMillis(); try{ File filein = new File("./input.txt"); BufferedReader br = new BufferedReader(new FileReader(filein)); int x[] = new int[100000]; br = new BufferedReader(new FileReader(filein)); Scanner scan = new Scanner(new File("./input.txt")); int k=0; while(scan.hasNext()){ x[k] = scan.nextInt(); k++; } br.close(); for(int i=0; i<k; i++){ for(int j=k; j>0; j--){ int z = j-1; if(x[z] > x[j]){ int tmp = x[j]; x[j] = x[z]; x[z] = tmp; } } } try{ File fileout = new File("./output.txt"); BufferedWriter bw = new BufferedWriter(new FileWriter(fileout)); PrintWriter pw = new PrintWriter(bw); for(int i=1; i<k+1; i++){ if(x[i]>0){ pw.print(x[i]); pw.print(" "); if (i%10 == 0) { pw.print("\r\n"); } } } pw.close(); bw.close(); } catch(IOException e){ System.out.println(e); } long stop = System.currentTimeMillis(); System.out.println("実行にかかった" + (stop - start) + " ミリ秒です"); } catch(FileNotFoundException e){ System.out.println(e); } catch(IOException e){ System.out.println(e); } } }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

そう, BufferedReader を 2回作ってるのはおかしい. で, その br はどこで使ってるの?

qpwowppq
質問者

お礼

回答ありがとうございます。 確かに使っていませんでした。 別のプログラムからコピーした際に消し忘れたということと、明らかに知識が不足していることを認識しました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

時間についての話は終わったので別件. File filein = new File("./input.txt"); BufferedReader br = new BufferedReader(new FileReader(filein)); int x[] = new int[100000]; br = new BufferedReader(new FileReader(filein)); Scanner scan = new Scanner(new File("./input.txt")); の部分をじっと見てください. おかしなことに気づきませんか?

qpwowppq
質問者

お礼

回答ありがとうございます。 配列を作った後に br = new BufferedReader(new FileReader(filein)); で再びインスタンスを生成していました。 この他にも使い方等でおかしなところがありましたら指摘していだだけるとありがたいです。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ファイルの読み書き時間は、そのデータ量にほぼ依存するので、同じデータ量で劇的に速く、というのは難しいです。 バブルソートは比較ソートの中ではこれといった高速化ギミックが無い「もっとも遅いアルゴリズム」です。 普通は、ソートのアルゴリズムを変更するものですが.... このプログラムでは、全体の時間しか測ってませんが、読み込み、ソート、書き込みに分けてそれぞれの時間を測定してはどうでしょう。ファイルの読み書きには言うほど時間かかってないかもしれません。

qpwowppq
質問者

お礼

回答ありがとうございます。 実際に10万行の整数で測ったところ読込みには300msくらいの時間がかかっていました。 また全体にかかる時間は30秒程度かかっていることから、読込みにかかる時間は全体の1%程度しかかかっておらずほとんどの時間をソートに費やしているため、これ以上の高速化はほとんど無意味とわかりました。

関連するQ&A

専門家に質問してみよう