C ++ повторяющихся fwrite fflu sh займет много времени - PullRequest
1 голос
/ 01 апреля 2020

В программе для моего Raspberry Pi 3B я пишу двоичный файл в непоследовательном режиме. Поэтому мне нужно записать блок в заданную c позицию в файле.

В моем l oop я вызываю по порядку: memcpy, чтобы скопировать блок, который мне нужен, в мой буфер, который будет записывать в файл , fseek, чтобы указать позицию, где этот блок должен быть wirte, fwrite, чтобы написать блок и fflu sh.

После некоторых циклов функции fwrite или fflu sh застряли и занимают много времени для завершения, даже если размер блока практически одинаков для всех вызовов.

Моя функция, которую я вызываю несколько раз:

static void writeChunk(FILE* total, unsigned char *data, T_Chunk* chk, int HEIGHT, int totalStride, int seekStride){

    char* buffer = new char[chk->stride];
    for(int row = 0; row < HEIGHT; ++row){
        auto start = chrono::steady_clock::now();

        memcpy( buffer, data + (row*chk->stride), chk->stride);


        //total.seekp((row * totalStride) + seekStride, total.beg);

        start = chrono::steady_clock::now();
        fseek(total, (row * totalStride) + seekStride, SEEK_SET);

        auto end = chrono::steady_clock::now();
        if(chrono::duration_cast<chrono::microseconds>(end - start).count() > 150)
            cout << "Elapsed time in microseconds fseek : " 
            << chrono::duration_cast<chrono::microseconds>(end - start).count()
            << endl;
        //total.write(buffer, chk->stride);


        start = chrono::steady_clock::now();
        fwrite(buffer, 1, chk->stride, total);



        end = chrono::steady_clock::now();
        if(chrono::duration_cast<chrono::microseconds>(end - start).count() > 150)
            cout << "Elapsed time in microseconds fwrite ( " << chk->stride << " ): " 
            << chrono::duration_cast<chrono::microseconds>(end - start).count()
            << endl;


        start = chrono::steady_clock::now();
        fflush(total);



        end = chrono::steady_clock::now();
        if(chrono::duration_cast<chrono::microseconds>(end - start).count() > 150)
            cout << "Elapsed time in microseconds fflush ( " << chk->stride << " ): " 
            << chrono::duration_cast<chrono::microseconds>(end - start).count()
            << endl;



        //total.flush();

    }
    free(buffer);
    free(data);

}

И есть некоторый вывод:

Elapsed time in microseconds fwrite ( 7552 ): 166
Elapsed time in microseconds fwrite ( 7296 ): 207
Elapsed time in microseconds fwrite ( 7488 ): 156
Elapsed time in microseconds fwrite ( 7680 ): 162
Elapsed time in microseconds fwrite ( 7616 ): 164
Elapsed time in microseconds fwrite ( 7488 ): 158
Elapsed time in microseconds fwrite ( 7680 ): 160
Elapsed time in microseconds fwrite ( 7616 ): 151
Elapsed time in microseconds fwrite ( 7296 ): 195
Elapsed time in microseconds fwrite ( 7296 ): 175
Elapsed time in microseconds fwrite ( 7296 ): 179
Elapsed time in microseconds fwrite ( 7552 ): 23034
Elapsed time in microseconds fwrite ( 7552 ): 27514
Elapsed time in microseconds fflush ( 7680 ): 34438
Elapsed time in microseconds fwrite ( 7680 ): 27492
Elapsed time in microseconds fwrite ( 7680 ): 26612
Elapsed time in microseconds fwrite ( 7616 ): 27856
Elapsed time in microseconds fflush ( 7616 ): 27502
Elapsed time in microseconds fwrite ( 7616 ): 27366
Elapsed time in microseconds fwrite ( 7616 ): 27444
Elapsed time in microseconds fflush ( 7616 ): 27881
Elapsed time in microseconds fflush ( 7616 ): 27593
Elapsed time in microseconds fflush ( 7616 ): 27417
Elapsed time in microseconds fflush ( 7552 ): 27582
Elapsed time in microseconds fwrite ( 7552 ): 27374
Elapsed time in microseconds fwrite ( 7552 ): 27517
Elapsed time in microseconds fwrite ( 7552 ): 24657
Elapsed time in microseconds fwrite ( 7488 ): 199
Elapsed time in microseconds fflush ( 7488 ): 27734
Elapsed time in microseconds fwrite ( 7488 ): 24747
Elapsed time in microseconds fflush ( 7488 ): 24714
Elapsed time in microseconds fwrite ( 7488 ): 187
Elapsed time in microseconds fwrite ( 7360 ): 228
Elapsed time in microseconds fflush ( 7360 ): 27808
Elapsed time in microseconds fflush ( 7360 ): 24886
Elapsed time in microseconds fwrite ( 7360 ): 24601
Elapsed time in microseconds fwrite ( 7680 ): 203
Elapsed time in microseconds fwrite ( 7680 ): 196
Elapsed time in microseconds fwrite ( 7680 ): 28047
Elapsed time in microseconds fflush ( 7680 ): 24879
Elapsed time in microseconds fflush ( 7680 ): 24948
Elapsed time in microseconds fwrite ( 7360 ): 202
Elapsed time in microseconds fflush ( 7360 ): 26000
Elapsed time in microseconds fwrite ( 7616 ): 24685
Elapsed time in microseconds fwrite ( 7616 ): 38157
Elapsed time in microseconds fwrite ( 7616 ): 38434
Elapsed time in microseconds fflush ( 7616 ): 38301
Elapsed time in microseconds fwrite ( 7616 ): 38315
Elapsed time in microseconds fwrite ( 7488 ): 29295
Elapsed time in microseconds fflush ( 7488 ): 38358
Elapsed time in microseconds fwrite ( 7488 ): 38366
Elapsed time in microseconds fwrite ( 7488 ): 36493
Elapsed time in microseconds fflush ( 7488 ): 36495
Elapsed time in microseconds fwrite ( 7488 ): **5432436**
Elapsed time in microseconds fwrite ( 7488 ): 982
Elapsed time in microseconds fflush ( 7488 ): **175095**
Elapsed time in microseconds fwrite ( 7552 ): 154
Elapsed time in microseconds fflush ( 7616 ): 224
Elapsed time in microseconds fwrite ( 7424 ): 279
Elapsed time in microseconds fflush ( 7488 ): 25078
Elapsed time in microseconds fwrite ( 7488 ): 27502
Elapsed time in microseconds fwrite ( 7488 ): 27483
Elapsed time in microseconds fwrite ( 7360 ): 28146
Elapsed time in microseconds fwrite ( 7360 ): 27558
Elapsed time in microseconds fflush ( 7360 ): 27403
Elapsed time in microseconds fwrite ( 7616 ): 27819
Elapsed time in microseconds fflush ( 7616 ): 27480

Почему время почти не одинаково для всех вызовов?

Почему после некоторых вызовов оно зависает так долго, как 5432436 или 175095 микросекунд, как вы можете видеть из журналов?

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

Проблема в моем коде или в HW, который я использую?

Как я могу улучшить мой код? Мне действительно не нужна скорость, но она не должна блокировать другой процесс ввода / вывода.

Спасибо.

...