Próbuję przeprowadzić migrację programu C# do C++. Program C# odczytuje wiersz tekstu o rozmiarach 1 ~ 5 gb po linii i wykonuje analizę każdej linii. Kod C# jest jak poniżej.C++ wydajność odczytu pliku tekstowego
using (var f = File.OpenRead(fname))
using (var reader = new StreamReader(f))
while (!reader.EndOfStream) {
var line = reader.ReadLine();
// do some analysis
}
Dla danego pliku 1,6 gb z 7 milionami linii, ten kod zajmuje około 18 sekund.
C++ kod I napisali pierwszy migracji jest jak poniżej
ifstream f(fname);
string line;
while (getline(f, line)) {
// do some analysis
}
C++ kod powyżej zajmuje około 420 sekund. Drugi napisany przeze mnie kod C++ jest jak poniżej.
ifstream f(fname);
char line[2000];
while (f.getline(line, 2000)) {
// do some analysis
}
C++ powyżej zajmuje około 85 sekund.
Ostatni kod, który próbowałem, to kod c, jak poniżej.
FILE *file = fopen (fname, "r");
char line[2000];
while (fgets(line, 2000, file) != NULL) {
// do some analysis
}
fclose (file);
Powyższy kod c zajmuje około 33 sekund.
Oba ostatnie 2 kody, które parsują linie na char [] zamiast łańcucha, potrzebują około 30 sekund więcej, aby przekształcić char [] na ciąg.
Czy istnieje sposób na polepszenie wydajności kodu c/C++ w celu odczytania pliku tekstowego wiersz po wierszu, aby dopasować wydajność C#? (Dodano: Używam Windows 7 64-bitowy OS z VC++ 10,0, x64)
Twoje pytanie jest podobne do tego wątku http://stackoverflow.com/questions/7102087/how-to-enhance-the-speed-of-my-c-program-in-reading-delimited-text-files/ 7102179 # 7102179 –
Interesujące pytanie brzmi: jak to robi C#? Dzięki temu dowiesz się, jakie optymalizacje wykorzystali i prawdopodobnie zaproponujesz kilka. – ssube