Tóm Tắt
[Nhanh] Lặp lại với std :: getline ()
Cách tiếp cận đơn thuần nhất là mở std :: ifstream và loop bằng những lệnh gọi std :: getline ( ). Mã sạch và dễ hiểu .
#include
std::ifstream file(FILENAME);
if (file.is_open()) {
std::string line;
while (getline(file, line)) {
// using printf() in all tests for consistency
printf("%s", line.c_str());
}
file.close();
}
[Nhanh] Sử dụng tệp_descrip_source của Boost
Một năng lực khác là sử dụng thư viện Boost, nhưng mã sẽ dài dòng hơn một chút ít. Hiệu suất khá giống với mã ở trên ( Lặp lại với std :: getline ( ) ) .
#include
#include
#include
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 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();
}
}
}
[Nhanh nhất] Sử dụng mã C
Nếu hiệu suất là quan trọng đối với phần mềm của bạn, bạn có thể xem xét sử dụng ngôn ngữ C. Mã này có thể nhanh hơn 4-5 lần so với các phiên bản C++ ở trên, xem điểm chuẩn bên dưới
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);
Điểm chuẩn – Cái nào nhanh hơn?
Tôi đã thực hiện một số điểm chuẩn hiệu suất với mã ở trên và kết quả rất thú vị. Tôi đã kiểm tra mã với các tệp ASCII có chứa 100.000 dòng, 1.000.000 dòng và 10.000.000 dòng văn bản. Mỗi dòng văn bản chứa trung bình 10 từ. Chương trình được biên dịch với tối ưu hóa -O3
và đầu ra của nó được chuyển tiếp tới /dev/null
để loại bỏ biến thời gian ghi nhật ký khỏi phép đo. Cuối cùng, nhưng không kém phần quan trọng, mỗi đoạn mã ghi lại từng dòng với hàm printf()
để thống nhất.
Kết quả cho thấy thời hạn ( tính bằng ms ) mà mỗi đoạn mã đã dùng để đọc những tệp .Sự độc lạ về hiệu năng giữa hai cách tiếp cận C + + là tối thiểu và không nên tạo ra bất kể sự độc lạ nào trong thực tiễn. Hiệu suất của mã C là những gì làm cho điểm chuẩn ấn tượng và hoàn toàn có thể là một đổi khác game show về vận tốc .
10K lines 100K lines 1000K lines
Loop with std::getline() 105ms 894ms 9773ms
Boost code 106ms 968ms 9561ms
C code 23ms 243ms 2397ms
Source: https://final-blade.com
Category: Kiến thức Internet