2

我想问一下是否有人在我的代码中看到了瓶颈或任何优化它的方法。我正在考虑我的代码是否有问题,或者我是否需要选择一种全新的方法。

我有一个内存映射文件,我需要从这个内存映射文件中读取双精度。我需要尽可能快地完成大约 100.000 次。

我期待它在发布模式下会很快,但事实并非如此。我第一次这样做,需要超过 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 进行了硬编码,但这并没有真正改变任何东西。

谢谢你的想法。

4

1 回答 1

1

您正在从文件中读取 12.5MB 的数据。这不是那么多,但它仍然不是微不足道的。

第一次和第二次运行之间的差异可能是由于文件缓存 - 第二次要读取文件时,数据已经在内存中,因此需要更少的 I/O。

但是,读取 12.5MB 的数据需要 5 秒,这仍然很多。我能找到的唯一原因是你的双打分散在整个文件中,需要 Windows 读取超过 12.5MB 的内存。

您可以完全避免内存映射。如果数据按顺序存储在文件中(不是连续的,而是按顺序存储的 - 您可以读取数据而无需回溯),您可以尝试完全避开内存映射文件,而只是寻找到正确位置的方式。

我怀疑这会有很大帮助。您可以做的其他事情是重新排序文件(如果可能的话),或者将其放在 SSD 上。

于 2013-06-16T11:07:48.940 回答