Оптимизация VS2019 под С/С++
Изучаю алгоритмы сортировки на С++. До этого прогнал все алгоритмы на C#. Есть сгенерированные тестовые файлы со строками по 50 Гб. Длина строки не превышает 250 символов. Пишу в Visual Studio 2019. Windows 10. Написал программу для чтения файла с диска. Программа читает строки line by line и выводит количество строки и время за которое выполнено чтение. C# читает файл со скоростью 155-160 мб/сек, если смотреть по монитору ресурсов.
string file = "....testFile....";
long count = 0;
ifstream input(file);
for (std::string line; getline(input, line); )
{
count++;
}
cout << count << endl;
system("pause");
return 0;
В режиме debug и без оптимизации скорость 2 мб/сек. В режиме release c флагом -О2 скорость 40-45 мб/сек. Ок. скорость маленькая. Переписал вот так:
char const* const fileName = "....testFile....";
FILE* file = fopen(fileName, "r");
char line[256];
long count = 0;
while (fgets(line, sizeof(line), file))
{
count++;
}
printf("%ld",count);
fclose(file);
system("pause");
return 0;
Скорость примерно 95-98 мб/сек. в режиме Release и флагом -О2 Тоже не дотягивает до C#. Далее использовал код с fget c компилятором. g++ также с флагом -О2. скорость 130-135 мб/сек.
Код на C#:
string inFile = @"....testFile....";
long count = 0;
StreamReader sr = new StreamReader(inFile);
string line;
Stopwatch sw = new Stopwatch();
sw.Start();
while((line = sr.ReadLine()) != null)
{
count++;
}
Console.WriteLine($"{count}");
sw.Stop();
Console.WriteLine($"Done. elapsed: {sw.ElapsedMilliseconds}");
Console.ReadKey();
Читал много вопросов на аналогичные темы, но ответ на них в основном отправляет в сторону Linux c кодом типа:
#include <iostream>
#include <sys/stat.h>
#include <chrono>
using namespace std;
int main()
{
string path = "/media/sf_Share_Folder/CPP/10.2.txt";
FILE* ifile = fopen("test file","r");
size_t linesSize = 4096+1;
char* line = new char[linesSize];
unsigned int i=0;
auto start = chrono::steady_clock::now();
while (getline(&line,&linesSize,ifile)>0)
{
i++;
}
auto finish = chrono::steady_clock::now();
auto elapsed_ms = chrono::duration_cast<chrono::milliseconds>(finish - start);
cout << dec << elapsed_ms.count() << endl;
delete[] line;
cout<<"Lines count: "<<i<<endl;
return 0;
}
И далее разъяснения на тему отличий getline. Этот код у меня под VirtualBox c Ubuntu 20.04 и QT creator c компилятором GCC без всякой оптимизации выдаёт 60мб/сек. Думаю при установке на физическую машину выдаст все 150 мб/сек, но я не проверял.
Вопрос мой вот в чем. Можно ли как-то оптимизировать код под VS2019 чтобы примерно подтянуть его к показателям по скорости чтения как у C# то есть 150 мб/сек?
Update: Установил QT creator 6.0.1 c mingw81_64 на этот же ПК. скорость считывания с fgets 145-150 мбит/сек.
Ответы (1 шт):
Следующий код на VS2019 даже без оптимизации и в режиме Debug выдаёт скорость чтения в ~240 Мб/сек. В режиме Release - O2 скорость стабильно 350-355 Мб/сек. При размере буфера 256 - скорость 340 Мб/сек. при размере буфера 8196 байт показывает максимальную указанную выше скорость.
char const* const fileName = "... test file ...";
char* buffer[8196];
FILE* file_ = fopen(fileName, "r");
auto start = chrono::steady_clock::now();
while (!feof(file_))
{
fread(buffer, sizeof(buffer), 1, file_);
}
auto end = chrono::steady_clock::now();
auto elapsed_ms = chrono::duration_cast<chrono::milliseconds>(end - start);
cout << "Elapsed ms: " << elapsed_ms.count() << endl;