Поиск размера файла в C - PullRequest
6 голосов
/ 06 мая 2011

Мне было интересно, было ли значительное увеличение производительности при использовании sys / stat.h по сравнению с fseek () и и ftell ()?

Ответы [ 5 ]

7 голосов
/ 06 мая 2011

Выбор между fstat() и комбинацией fseek()/ftell() не будет большой разницы. Одиночный вызов функции должен быть немного быстрее, чем двойной вызов функции, но разница не будет большой.

Выбор между stat() и комбинацией не очень справедливое сравнение. Для комбинированных вызовов тяжелая работа была проделана, когда файл был открыт, поэтому информация об узле легко доступна. Вызов stat() должен проанализировать путь к файлу и затем сообщить, что он находит. Это почти всегда должно быть медленнее - если вы все равно недавно не открыли файл, чтобы ядро ​​сохранило большую часть информации в кэше. Тем не менее, поиск пути, требуемый stat(), вероятно, сделает его медленнее, чем комбинация.

6 голосов
/ 14 марта 2012

Если вы не уверены, попробуйте!

Я только что написал этот тест.Я сгенерировал 10 000 файлов по 2 КБ каждый и прошел по всем из них, запрашивая размер их файлов.

Результаты на моей машине, измеренные с помощью команды "time" и выполненные в среднем 10 прогонов:

  • версия fseek / fclose: 0,22 секунды
  • версия статистики: 0,06 секунды

Итак, победитель (по крайней мере, на моей машине): stat !

Вот код теста:

#include <stdio.h>
#include <sys/stat.h>

#if 0 
size_t getFileSize(const char * filename)
{
    struct stat st;
    stat(filename, &st);
    return st.st_size;
}
#else
size_t getFileSize(const char * filename)
{
    FILE * fd=fopen(filename, "rb");
    if(!fd)
        printf("ERROR on file %s\n", filename);

    fseek(fd, 0, SEEK_END);
    size_t size = ftell(fd);
    fclose(fd);
    return size;
}
#endif

int main()
{   
    char buf[256];
    int i, n;
    for(i=0; i<10000; ++i)
    {   
        sprintf(buf, "file_%d", i);
        if(getFileSize(buf)!= 2048)
            printf("WRONG!\n");
    }
    return 0;
}
0 голосов
/ 28 февраля 2015

В зависимости от обстоятельств, stat() может быть в сотни раз быстрее, чем seek()/tell().В настоящее время я играю с sshfs / FUSE и получение размера нескольких тысяч файлов с помощью seek()/tell() занимает более минуты, а с stat() - за секундуТак что разница при работе над sshfs / FUSE очень велика.

0 голосов
/ 06 мая 2011

Для stat.h вы в основном хотите использовать его, чтобы сообщить статистику файла. Например, если вы хотите сказать, является ли это файл или каталог и т. Д.

Однако, если вы хотите сделать манипуляции с файлом, то вы, вероятно, захотите использовать ftell () и fseek (). То есть вы фактически делаете манипуляции с самим файловым потоком.

Так что с точки зрения производительности, это действительно то, что вам нужно.

Надеюсь, это поможет :) Ура!

0 голосов
/ 06 мая 2011

Логически, можно предположить, что fseek() при запросе поиска в конце файла использует stat, чтобы узнать, как далеко искать, или, скорее, где находится конец файла.

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

Тем не менее, любая разница в производительности, вероятно, будет незначительной, и если вам все равно понадобится открыть файл по какой-либо причине, fseek / ftell, вероятно, значительно улучшит читабельность вашего кода.

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