Performace читает из файла fgetc vs fread всю строку - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь проверить, что быстрее:

  1. Рассчитать размер файла, прочитать все содержимое в строку (символ *), операции со строкой
    VS.
  2. Читайте char за char с помощью fgetc и выполняйте операции с одним char.

Мои результаты говорят, что нет различий.Как вы думаете?

  1. Что на самом деле быстрее?
  2. Сложность работы имеет значение?
  3. Тип жесткого диска имеет значение (HDD / SSD)?
  4. В первом случае использовать больше памяти, поэтому в больших файлах будет хуже, верно?
  5. Есть различие, когда файл маленький?
  6. Операционная система имеет значение?(Я использую Linux Ubuntu 14)

Мой код ниже:

Начало:

    size_t start = clock();
    volatile size_t some = 0;
    FILE* fh = fopen("/home/xxx/test/file.txt", "r");
  1. case
    size_t size = 0;
    fseek(fh, 0L, SEEK_END);
    size = ftell(fh);
    rewind(fh);
    char* result = (char*) malloc(sizeof(char) * (size + 1));
    fread((void*) result, sizeof(char), size, fh);
    result[size] = '\0';

    for (size_t i = 0; i < size; i++)
    {
        if (result[i] % 2)
        {
            some++;
        }
    }

    free(result);
case
    int c = fgetc(fh);
    while (c != EOF)
    {
        if (c % 2)
        {
            some++;
        }

        c = fgetc(fh);
    }

Конец:

    fclose(fh);
    size_t end = clock();
    printf("TIME = %zu\n", end - start);

В моем случае операция - это простое условие, энергозависимое предотвращает оптимизацию компилятора.

1 Ответ

1 голос
/ 17 апреля 2019

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

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

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

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