C++ endl vs \n

endl (standart end line) ve \n (new line character) her ikisi de satır başlatır ancak endl her seferinde stream buffer flush işlemi yapar. Türkçe ifadeyle, byte akışı ara belleğini boşaltır. endl, gerek duyulmadıkça, döngülerde ya da program içerisinde sıkça kullanılırsa, her defasında yaptığı buffer flush işlemi sebebiyle performans kaybı yaratır. Program genelinde \n kullanmayı alışkanlık haline getirmeliyiz. endl ise stream buffer flush işlemine ihtiyaç duyulduğu zamanlarda başvurulacak komut olmalıdır.

Peki stream buffer tam olarak ne işe yarar?

Tamamen performans ile ilgilidir. Adından da anlaşılacağı üzere, standart giriş-çıkış çıkış kütüphanesi olan iostream, akış mantığıyla çalışır. Borudan akan bir su gibi, klavyeden okunan ya da ekrana yazdırılacak her karakter sırasıyla ara belleğe alınır ve daha sonra toplu olarak işlenir. Bir dosyaya yazmayı düşünün. Her karakterin tek tek yazılması pahalı bir işlemdir. Bu nedenle, yazdığınız verileri geçici olarak bir arabellekte depolamak, performans açısından doğru bir yöntemdir. Tamponlama işlemi bittiğinde, tek seferde büyük bir blok yazılarak, performans arttırılmış olur.

Şimdi, aşağıdaki iki örnekte, endl deyiminin ve \n karakterlerinin kullanımlarını inceleyelim.

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  cout << "I am learning C++";
  return 0;
}
#include <iostream>
using namespace std;

int main() {
  cout << "Hello World! \n";
  cout << "I am learning C++";
  return 0;
}

Yukarıdaki örneklerde endl ve \n kullanımlarında performans açısından sıkıntı yoktur.

Şimdiyse, döngü içerisinde kullanıldıklarında nelerin gerçekleştiğini görelim.

#include <iostream>
using namespace std;

int main() {
  for (char i='A'; i <= 'Z'; i++)
  {
    cout << i << endl;
  }
  return 0;
}
#include <iostream>
using namespace std;

int main() {
  for (char i='A'; i <= 'Z'; i++)
  {
    cout << i << "\n";
  }
  return 0;
}

Yukarıdaki her iki örnekte, ekrana 26 harf satır satır yazdırıldı. endl kullanımında, biz farkında olmadan, her satırda stream buffer flush işlemi gerçekleştirildi. Derleme ve çalıştırma anında, aralarındaki performans farkını hissetmedik. Bu tarzda, küçük boyutlu işlemlerde farkı hissetmeyiz fakat yüz bin satırdan başlayan bir yazıyı, bir dosyaya yazdırmak istediğimizde performans kaybını gözlemleyebiliriz.

Ads Blocker Image Powered by Code Help Pro

Reklam Engelleyici Algılandı!

Reklamları engellemek için uzantı kullandığınızı tespit ettik.

Lütfen bu reklam engelleyiciyi devre dışı bırakarak ya da sitemize izin vererek bize destek olun.

Dikkat: VPN eklentiniz üzerinde de reklam engelleyici olabilir.