Forum: Diğer Konular RSS
endl vs \n [C++]
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: endl vs \n [C++]
Aslında C++ ile uğraştığım söylenemez  :-D Ama bir forumda benim de işin içinden çıkamadığım bir soru geldi.

Örneğin şu ikisinin aynı olduğunu biliyoruz.
    cout << "birseyler" << endl;
    cout << "birseyler" << '\n' << flush;

Hatta C++ FAQ Lite'de:

[15.7] Should I end my output lines with std::endl or '\n'?

çoğu durumda performans açısından endl yerine \n kullanılması tavsiye ediliyor.

#include <iostream>
#include <fstream>
 
using namespace std;
 
int main() {
    ofstream cikisAkimi("alfabe.txt", ios::out);
 
    for (char harf = 'A'; harf <= 'Z'; ++harf) {
        cikisAkimi << harf << endl;
    }
 
    return 0;
}
Örneğin yukarıdaki programda gereksiz yere 26 kere std::flush çağrılıyor. Ama \n kullansaydık sadece bir kere program sonlandırılırken çıkış akımının belleği ekrana yazılacaktı.

Benim merak ettiğim her flush ile beraber 26 kere dosya da açılırmı? Ayrıca endl ve \n in performans olarak karşılaştırmasını gösteren gerçek bir örnek nasıl yazabiliriz? Eğer ciddi olarak bir performans farkı varsa.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hayır, dosya her flush için açılmaz. Karakterler önce bir ara belleğe yazılırlar ve sonra belirli zamanlarda hep birden flush ile yazılırlar.

Konuyu D'ye bağlamış olmak için: writeln da bir ara bellek kullanır (veya kullanabilir?). D'de flush std.stdio.File'ın bir üye işlevidir. Örneğin stdio.flush;

Bu iş aslında o kadar temiz değil, dosyayla aramızda bir de dosya sistemi var. Onun da bu konuda etkileri oluyor sanıyorum.

Ek olarak, C++'ta cout cin'e bağlı olduğu için cin'den okumaya kalkınca da otomatik olarak cout flush edilir. (D'de de olmalı. (?))

Yazdığın program bunu denemek için uygun. Daha çok karakter fazla karakterli çok daha fazla satır yazdırırsan farkını görebilirsin herhalde. (Şimdi zamanım yok; deneyemedim. :))

Ali
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben bunu aşağıdaki programla denedim. flush satırının hiçbir etkisi olmuyor.

import std.stdio;
 
void main()
{
    auto dosya = File("deneme_dosyasi", "w");
 
    foreach (i; 0 .. 100_000) {
        dosya.writeln(i);
        // dosya.flush();
    }
}

File.flush, C kütüphanesindeki fflush'ı çağırıyormuş. Onun belgesinde de diske yazılacağının garanti edilmediğini söylüyor. Çünkü fflush yazdığını düşünse bile çekirdek kendi ara belleğinde tutuyor olabilirmiş. Onu da yazdırmak için ayrıca fsync ve sync işlevleri var; ama onları D'nin C ilintileri arasında göremedim ve o noktada ilgimi kaybetmeye başladım. :)

Ali
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
D'de umarım böyle şeylere ihtiyaç duymayız  :-D

Gerçekten D'ye alışınca C++ bile biraz ? ! :-/  gelmeye başladı :)

Ben de ilk verdiğim örnekte dosyaya 1.000.000 sayı yazdırınca 4 saniyelik bir fark oluştuğunu farkettim.

Bu endl kullanan versiyon:
 
$ time ./sayiyaz

real    0m4.699s
user    0m0.552s
sys    0m4.144s

Bu da \n kullanan versiyon:

$ time ./sayiyaz

real    0m0.241s
user    0m0.212s
sys    0m0.024s

Bir kaç kere çalıştırıldığında sonuçlar çok az farkedilebiliyor ama gene de hemen hemen 4 saniyelik bir fark oluşuyor.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu gibi konular gerçekten ihtiyaç duyulana kadar önemli değil. Yazdırmak istiyorsak writeln() demeliyiz ve bitmeli. :)

Daha çok deneyler yapılması gerekir ama gösterdiğin sonuçlara baktığımızda 4 saniyelik fark değil, 4.699/0.241=19.498, yani 19 kat hız farkı olduğu görülüyor. Sisteme çok bağlı bir işlem olduğu için de sistem zamanı 4.144/0.024=172.667, yani 170 kat! ;)

Tek deneye güvenemeyiz tabii ama böyle bir karşılaştırma daha gerçekçi olur.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 04:06:38 (UTC -08:00)