Membaca file baris demi baris dalam C ++ dapat dilakukan dengan beberapa cara berbeda.
[Cepat] Loop dengan std :: getline ()
Pendekatan paling sederhana adalah dengan membuka panggilan std :: ifstream dan loop menggunakan std :: getline (). Kode ini bersih dan mudah dimengerti.
#include <fstream>
std::ifstream file(FILENAME);
if (file.is_open()) {
std::string line;
while (std::getline(file, line)) {
// using printf() in all tests for consistency
printf("%s", line.c_str());
}
file.close();
}
[Cepat] Gunakan Boost's file_description_source
Kemungkinan lain adalah dengan menggunakan pustaka Boost, tetapi kode mendapat sedikit lebih banyak verbose. Kinerja sangat mirip dengan kode di atas (Loop with std :: getline ()).
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/stream.hpp>
#include <fcntl.h>
namespace io = boost::iostreams;
void readLineByLineBoost() {
int fdr = open(FILENAME, O_RDONLY);
if (fdr >= 0) {
io::file_descriptor_source fdDevice(fdr, io::file_descriptor_flags::close_handle);
io::stream <io::file_descriptor_source> in(fdDevice);
if (fdDevice.is_open()) {
std::string line;
while (std::getline(in, line)) {
// using printf() in all tests for consistency
printf("%s", line.c_str());
}
fdDevice.close();
}
}
}
[Tercepat] Gunakan kode C
Jika kinerja sangat penting untuk perangkat lunak Anda, Anda dapat mempertimbangkan menggunakan bahasa C. Kode ini bisa 4-5 kali lebih cepat daripada versi C ++ di atas, lihat patokan di bawah ini
FILE* fp = fopen(FILENAME, "r");
if (fp == NULL)
exit(EXIT_FAILURE);
char* line = NULL;
size_t len = 0;
while ((getline(&line, &len, fp)) != -1) {
// using printf() in all tests for consistency
printf("%s", line);
}
fclose(fp);
if (line)
free(line);
Benchmark - Mana yang lebih cepat?
Saya telah melakukan beberapa tolok ukur kinerja dengan kode di atas dan hasilnya menarik. Saya telah menguji kode dengan file ASCII yang berisi 100.000 baris, 1.000.000 baris dan 10.000.000 baris teks. Setiap baris teks rata-rata berisi 10 kata. Program ini dikompilasi dengan -O3
optimasi dan outputnya diteruskan /dev/null
untuk menghapus variabel waktu logging dari pengukuran. Terakhir, namun tidak kalah pentingnya, setiap potongan kode mencatat setiap baris dengan printf()
fungsi untuk konsistensi.
Hasilnya menunjukkan waktu (dalam ms) yang diambil oleh setiap bagian kode untuk membaca file.
Perbedaan kinerja antara kedua pendekatan C ++ minimal dan seharusnya tidak membuat perbedaan dalam praktik. Performa kode C adalah apa yang membuat benchmark itu mengesankan dan bisa menjadi pengubah permainan dalam hal kecepatan.
10K lines 100K lines 1000K lines
Loop with std::getline() 105ms 894ms 9773ms
Boost code 106ms 968ms 9561ms
C code 23ms 243ms 2397ms