Я создал программу, которая тестирует carchive
, Я хотел посмотреть, как быстро удалось сохранить миллион точек данных:
#include "stdafx.h"#include "TestData.h"#include <iostream>
#include <vector>
using namespace std;
void pause() {
cin.clear();
cout << endl << "Press any key to continue...";
cin.ignore();
}
int _tmain(int argc, _TCHAR* argv[])
{
int numOfPoint = 1000000;
printf("Starting test...\n\n");
vector<TestData>* dataPoints = new vector<TestData>();
printf("Creating %i points...\n", numOfPoint);
for (int i = 0; i < numOfPoint; i++)
{
TestData* dataPoint = new TestData();
dataPoints->push_back(*dataPoint);
}
printf("Finished creating points.\n\n");
printf("Creating archive...\n");
CFile* pFile = new CFile();
CFileException e;
TCHAR* fileName = _T("foo.dat");
ASSERT(pFile != NULL);
if (!pFile->Open(fileName, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &e))
{
return -1;
}
bool bReading = false;
CArchive* pArchive = NULL;
try
{
pFile->SeekToBegin();
UINT uMode = (bReading ? CArchive::load : CArchive::store);
pArchive = new CArchive(pFile, uMode);
ASSERT(pArchive != NULL);
}
catch (CException* pException)
{
return -2;
}
printf("Finished creating archive.\n\n");
//SERIALIZING DATA
printf("Serializing data...\n");
for (int i = 0; i < dataPoints->size(); i++)
{
dataPoints->at(i).serialize(pArchive);
}
printf("Finished serializing data.\n\n");
printf("Cleaning up...\n");
pArchive->Close();
delete pArchive;
pFile->Close();
delete pFile;
printf("Finished cleaning up.\n\n");
printf("Test Complete.\n");
pause();
return 0;
}
Когда я запускаю этот код, на создание точек данных уходит некоторое время, но затем он проходит практически весь остальной код. Тем не менее, мне нужно подождать около 4 минут, чтобы приложение действительно завершило работу. Я бы предположил, что приложение будет ожидать зависания в части данных сериализации, как это происходило при создании точек данных.
Поэтому мой вопрос о том, как это на самом деле работает. Есть ли carchive
сделать свое дело в отдельном потоке и разрешить выполнение остальной части кода?
Я могу предоставить больше информации, если это необходимо.
Если вы хотите создать вектор с миллионом элементов, инициализированных по умолчанию, просто используйте эту версию конструктора.
vector<TestData> dataPoints{numOfPoint};
Ты должен остановиться new
Во всём, позвольте RAII провести очистку для вас.
Также знайте, что push_back
требует resize
вашего вектора, если его емкость недостаточно велика, поэтому, если вы начинаете с пустого вектора и знаете, насколько большим он будет в конце, вы можете использовать reserve
досрочно.
vector<TestData> dataPoints;
dataPoints.reserve(numOfPoint);
for (int i = 0; i < numOfPoint; i++)
{
dataPoints->push_back(TestData{});
}