2

私のコードにボトルネックがあるかどうか、またはそれを最適化する方法があるかどうかを尋ねたいと思います。コードのどこかに問題があるのか​​、それともまったく新しいアプローチを選択する必要があるのか​​を考えています。

ファイルをメモリ マップしましたが、このメモリ マップ ファイルから double を読み取る必要があります。これを可能な限り約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 のデータを読み取っています。それほど多くはありませんが、それでも簡単ではありません。

1 回目と 2 回目の実行の違いは、おそらくファイル キャッシングによるものです。2 回目にファイルを読み取ろうとすると、データは既にメモリ内にあるため、必要な I/O が少なくなります。

ただし、12.5MB のデータを読み取るのに 5 秒もかかります。これについて私が見つけることができる唯一の理由は、ダブルスがファイル全体に散らばっており、Windowsが12.5MBをはるかに超えるメモリへの読み取りを必要とすることです。

メモリ マッピングを完全に回避できます。データがファイルに順番に格納されている場合 (連続していませんが、順番に - シークバックせずにデータを読み取ることができます)、メモリ マップされたファイルを完全に回避して、適切な場所への道を探すことができます。

これが大いに役立つとは思えません。他にできることは、可能な場合はファイルの順序を変更するか、SSD に配置することです。

于 2013-06-16T11:07:48.940 に答える