SORU
9 NİSAN 2014, ÇARŞAMBA


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
9 NİSAN 2014, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Angry Paintballer

    Angry Paintb

    8 Ocak 2012
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007