Я хотел бы спросить, видит ли кто-нибудь узкое место в моем коде или какой-либо способ его оптимизации.
Я думаю о том, есть ли где-то ошибка в моем коде или мне нужно выбрать совершенно новый подход.
У меня есть файл с отображенной памятью, и мне нужно прочитать дубликаты из этого файла с отображенной памятью.
Мне нужно сделать это примерно в 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, но это ничего не изменило.
Спасибо за ваши идеи.
Вы читаете 12,5 МБ данных из файла. Это не так много, но это все еще не тривиально.
Разница между вашим первым и вторым запуском, вероятно, связана с кэшированием файла — при втором чтении файла данные уже находятся в памяти, поэтому требуется меньше операций ввода-вывода.
Тем не менее, 5 секунд для чтения 12,5 МБ данных все еще много. Единственная причина, которую я могу найти для этого, состоит в том, что ваши двойники разбросаны по всему файлу, что требует от Windows более 12,5 МБ для чтения в память.
Вы можете полностью избежать отображения памяти. Если данные хранятся в файле по порядку (не по порядку, а по порядку — вы можете читать данные, не возвращаясь назад), вы можете попытаться вообще избежать отображения файла памяти и просто найти свой путь в нужное место.
Я сомневаюсь, что это очень поможет. Другие вещи, которые вы можете сделать, это изменить порядок файлов, если это вообще возможно, или поместить их на SSD.
Других решений пока нет …