Правильный способ вычисления времени для алгоритма чтения из файла с буфером - PullRequest
0 голосов
/ 28 мая 2019

У меня проблема со сбором данных для алгоритмов поиска по шаблону.

Алгоритм измерения:

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
        cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}
double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

В каждой итерации я увеличиваю количество символов в шаблоне. В каждой итерации, пока я читаю 2048 символов в буфере из файла, который содержит 500000 случайных символов из алфавита, я использую алгоритм поиска по шаблону.

for (int i = 0; i <= 15; i++) {

    cout << pat << endl;
    file_1 = fopen("alphabet_1.txt", "a+");
    file_2 = fopen("alphabet_2.txt", "a+");
    file_3 = fopen("alphabet_3.txt", "a+");

    StartCounter();
    while (!feof(file_1)) {
        const size_t nchars = fread(buffer, 1, sizeof(buffer) - 1, file_1);
        buffer[nchars] = '\0';
        BM(buffer, pat);
    }
    time1 = GetCounter();
    cout << time1 << endl;

    StartCounter();
    while (!feof(file_2)) {
        const size_t nchars = fr

        StartCounter();
        while (!feof(file_3)) {
            const size_t nchars = fread(buffer, 1, sizeof(buffer) - 1, file_3);
            buffer[nchars] = '\0';
            SUNDAY(buffer, pat_a);
        }
        time3 = GetCounter();
        cout << time3 << endl;

        size_of = pat.size();
        abc_pat << left << setw(15) << size_of << left << setw(15) << time1 << left << setw(15) << time2 << left << setw(15) << time3 << endl;
        pat += random_PAT(2);
        cout << pat << endl;
    }
}

Вот данные, собранные, но, похоже, они неправильные:

Pattern Size         Boyer          KMP            Sunday
     1              7.29172        4.09554        5.29126   
     4              3.42968        4.03492        4.81207   
     7              2.32056        4.24628        4.7306    
     10             2.25833        4.26425        4.89514   
     13             1.56521        4.38645        4.63406   
     16             1.80224        4.21196        4.69468   
     19             1.65085        4.25847        4.97276   
     22             1.40548        3.97077        4.62123   
     25             1.52448        4.11863        4.77454   
     28             1.81347        4.38837        4.77743   
     31             2.02291        4.06378        4.91791   
     34             1.75894        4.26457        4.84318   
     37             1.59119        4.27419        4.74985   
     40             1.62615        4.24853        4.60231   
     43             1.65149        4.20202        4.86948   
     46             1.76664        4.0965         4.84671   
     49             1.47316        4.34154        4.92882   
     52             1.41511        4.44226        4.91374   
     55             1.33011        4.42333        4.79796   
     58             1.42569        4.06956        4.48459   
     61             1.4536         4.12536        4.87269 

Коды поиска шаблонов не мои, я собрал их здесь, чтобы собрать данные. Когда я их проверял, они работали правильно, возвращали то же количество найденных шаблонов и т. Д.

...