Какой из файлов FILE * или ifstream лучше использует память? - PullRequest
1 голос
/ 30 апреля 2010

Мне нужно прочитать фиксированное количество байтов из файлов, размер которых составляет около 50 МБ. Чтобы быть более точным, считайте кадр из файлов формата YUV 4: 2: 0 CIF / QCIF (от ~ 25 КБ до ~ 100 КБ на кадр). Не очень большое количество, но я не хочу, чтобы весь файл был в памяти. Я использую C ++, в таком случае, какой из FILE * или ifstream лучше (меньше / меньше) использует память? Пожалуйста, советуйте. Спасибо!

EDIT:

Я прочитал фиксированное количество байтов: 25 КБ или 100 КБ (в зависимости от формата QCIF / CIF). Чтение в двоичном режиме и только вперед. Нет необходимости искать. Не нужно писать, только чтение.

EDIT:

Если определить лучшие из них сложно, какой из них не требует загрузки всего файла в память?

Ответы [ 4 ]

4 голосов
/ 30 апреля 2010

Невозможно сказать - это будет зависеть от реализации и от того, как вы читаете данные, которые вы не описали.В целом, вопросы, касающиеся производительности, несколько бессмысленны, поскольку они сильно зависят от фактического использования вами функций библиотеки и языка, конкретной реализации, вашего оборудования и т. Д. И т. Д.ответьте на свой расширенный вопрос - ни одна библиотека не требует, чтобы вы прочитали все в память.Почему вы думаете, что они делают?

2 голосов
/ 30 апреля 2010

Я думаю, что лучшим ответом будет "profile and see" , но теоретически FILE * должен быть более эффективным во времени и использовании памяти. Потоки добавляют различные оболочки, обработчики ошибок и т. Д. И т. Д. И т. Д. По сравнению с необработанными процедурами чтения / записи, которые могут (в вашем конкретном случае) повлиять на использование памяти.

1 голос
/ 30 апреля 2010

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

Если обработка, которую вы выполняете с файлом, очень проста и / или вам не нужно разбирать текстовый файл ввода, FILE * подойдет вам хорошо. С другой стороны, если верно обратное, я бы пошел на ifstream - я считаю, что оператор >> намного удобнее и безопаснее, чем использование fscanf.

0 голосов
/ 30 апреля 2010

С точки зрения производительности, вам определенно лучше с FILE * (я рассказывал об этом некоторое время назад в моем проекте). Iostreams с точки зрения памяти не должны представлять большой проблемы, хотя я думаю, что это связано с некоторыми накладными расходами, связанными с библиотекой C.

...