Neden Java büyük bir dosyayı C den daha hızlı okuyor mu ?
Hangi dosyada her satırda bir kelime 2 GB bir dosya (iputfile.txt
), gibi:
apple
red
beautiful
smell
spark
input
Dosyasında her kelimeyi okumak için bir program yazmam gerekiyor ve kelime sayısını yazdırın. Java ve C ile uğraştım , ama sonuç şaşırtıcı değil: Java çalışır C göre 2,3 kat daha hızlı . Benim kod aşağıdaki gibidir:
C :
int main() {
struct timespec ts, te;
double cost;
clock_gettime(CLOCK_REALTIME, &ts);
ifstream fin("inputfile.txt");
string word;
int count = 0;
while(fin >> word) {
count ;
}
cout << count << endl;
clock_gettime(CLOCK_REALTIME, &te);
cost = te.tv_sec - ts.tv_sec (double)(te.tv_nsec-ts.tv_nsec)/NANO;
printf("Run time: %-15.10f s\n", cost);
return 0;
}
Çıkış:
5e 08
Run time: 69.311 s
Java:
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
FileReader reader = new FileReader("inputfile.txt");
BufferedReader br = new BufferedReader(reader);
String str = null;
int count = 0;
while((str = br.readLine()) != null) {
count ;
}
System.out.println(count);
long endTime = System.currentTimeMillis();
System.out.println("Run time : " (endTime - startTime)/1000 "s");
}
Çıkış:
5.0E8
Run time: 29 s
Neden daha hızlı C bu durumda daha, Java ve C performansını artırmak mı ?
CEVAP
Aynı şeyi karşılaştırma değil. Java program okur satırları, C programı beyaz boşluk ile ayrılmış okurken yeni satır üzerinde depening, "sözcükleri biraz ekstra çalışma.",
istream::getline
deneyin.
Daha sonra
Ayrıca deneyin ve temel okuma işlemi bir bayt dizisi okuma ve yeni satır için bu tarama yapabilirsiniz.
Sonra bile
Benim eski Linux dizüstü, jdk1.7.-Söyle-bana-mi-eski 4.3.3 aynı zamanda, C getline ile karşılaştırma hakkında al 0_21 ve don. (Kelime okuma daha yavaş olduğunu tespit ettik.) -O0 ve bana, döngü kodu sadeliği verilen sürpriz değil-O2 arasında pek bir fark yok.
Son bir not Söylediğim gibi, fin.read(buffer,LEN) LEN = 1MB ve kullanma memchr tarama için '\n' sonuçlarında başka bir hızlı iyileşme yaklaşık 'si, C yoktur C sol tarafından artık) daha hızlı Java.
Neden bitişik in Java daha hızlı geçiş...
Neden StringBuilder#(int) Java 8'de da...
Kıyaslama - neden ikinci döngü daha hı...
Neden sıralanmamış bir dizi daha hızlı...
Neden Python kodunu daha hızlı bir işl...