оптимизация — C ++ memcopy из сопоставленного файла слишком медленный

Я хотел бы спросить, видит ли кто-нибудь узкое место в моем коде или какой-либо способ его оптимизации.
Я думаю о том, есть ли где-то ошибка в моем коде или мне нужно выбрать совершенно новый подход.

У меня есть файл с отображенной памятью, и мне нужно прочитать дубликаты из этого файла с отображенной памятью.
Мне нужно сделать это примерно в 100.000 раз быстрее.

Я ожидал, что это будет довольно быстро в режиме Release, но это не так.
Первый раз, когда я делаю это, это занимает более 5 секунд. В следующий раз это займет около 200 мс. Это немного быстрее (я полагаю, это связано с тем, как Windows обрабатывает файл с отображением в памяти), но все еще слишком медленно.

void clsMapping::FeedJoinFeaturesFromMap(vector<double> &uJoinFeatures,int uHPIndex)
{
int iBytePos=this->Content()[uHPIndex];
int iByteCount=16*sizeof(double);

uJoinFeatures.resize(16);
memcpy(&uJoinFeatures[0], &((char*)(m_pVoiceData))[iBytePos],iByteCount);
}

Кто-нибудь видит способ улучшить мой код? Я жестко закодировал iByteCountCount, но это ничего не изменило.

Спасибо за ваши идеи.

2

Решение

Вы читаете 12,5 МБ данных из файла. Это не так много, но это все еще не тривиально.

Разница между вашим первым и вторым запуском, вероятно, связана с кэшированием файла — при втором чтении файла данные уже находятся в памяти, поэтому требуется меньше операций ввода-вывода.

Тем не менее, 5 секунд для чтения 12,5 МБ данных все еще много. Единственная причина, которую я могу найти для этого, состоит в том, что ваши двойники разбросаны по всему файлу, что требует от Windows более 12,5 МБ для чтения в память.

Вы можете полностью избежать отображения памяти. Если данные хранятся в файле по порядку (не по порядку, а по порядку — вы можете читать данные, не возвращаясь назад), вы можете попытаться вообще избежать отображения файла памяти и просто найти свой путь в нужное место.

Я сомневаюсь, что это очень поможет. Другие вещи, которые вы можете сделать, это изменить порядок файлов, если это вообще возможно, или поместить их на SSD.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]