Который быстрее в памяти, ints или символах? И отображение файла или чтение блока?

Хорошо, таким образом, я записал (скорее неоптимизированный) программа прежде для кодирования изображений к JPEGs, однако, теперь я работаю с транспортными потоками MPEG-2, и H.264 закодировал видео в них. Прежде чем я погружусь в программирование все это, мне любопытно, какой самый быстрый способ иметь дело с фактическим файлом.

В настоящее время я - отображение файла .mts файл в память для работы над ним, хотя я не уверен, было ли это быстрее, чтобы (например), считать 100 МБ файла в память в блоках и соглашении с ним тот путь.

Эти файлы требуют, чтобы большое смещение бита и такой считало флаги, таким образом, я задаюсь вопросом что, когда я ссылаюсь на часть памяти, если это быстрее для чтения 4 байтов сразу как целого числа или 1 байта как символ. Я думал, что считал где-нибудь, что x86 процессоры оптимизированы к 4-байтовой гранулярности, но я не уверен, верно ли это...

Спасибо!

6
задан Nick 7 April 2010 в 05:09
поделиться

5 ответов

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

Да, доступ к памяти с 4-байтовой (или даже 8-байтовой) степенью детализации выполняется быстрее, чем доступ к ней побайтно. Опять же, это компромисс - в зависимости от того, что вам нужно делать с данными впоследствии и насколько вы опытны в работе с битами в int, в целом это может быть не быстрее.

Что касается всего, что касается оптимизации:

  1. мера
  2. оптимизация
  3. мера
2
ответ дан 10 December 2019 в 02:45
поделиться

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

Поскольку вы декодируете потоки mpeg, вы можете использовать подход с двойной буферизацией с асинхронным чтением файлов. Это работает следующим образом:

blocksize = 65536 bytes (or whatever)
currentblock = new byte [blocksize]
nextblock = new byte [blocksize]
read currentblock
while processing
   asynchronously read nextblock
   parse currentblock
   wait for asynchronous read to complete
   swap nextblock and currentblock
endwhile
0
ответ дан 10 December 2019 в 02:45
поделиться

Файлы с отображением в память обычно являются самыми быстрыми операциями из доступных, если вам требуется, чтобы ваш файл был доступен синхронно. (Есть некоторые асинхронные API-интерфейсы, которые позволяют O / S иногда переупорядочивать вещи для небольшого увеличения скорости, но это звучит так, как будто это бесполезно для вашего приложения)

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

Что касается обращения к памяти, в памяти x86 будет читаться целая строка за раз, независимо от того, с чем вы на самом деле работаете. Дополнительное время, связанное с небайтовыми гранулированными операциями, относится к тому факту, что целые числа не нужно выравнивать по байтам. Например, выполнение ADD займет больше времени, если что-то не выровнено по 4-байтовой границе, но для чего-то вроде копии в памяти будет небольшая разница. Если вы работаете с символьными данными, то будет быстрее сохранить их таким образом, чем читать все как целые числа и сдвигать биты.

Если вы выполняете кодирование h.264 или MPEG2, узким местом, вероятно, будет процессорное время, а не дисковый ввод-вывод в любом случае.

6
ответ дан 10 December 2019 в 02:45
поделиться

Что касается наилучшего размера для чтения из памяти, я уверен, вам понравится этот пост о производительности доступа к памяти и кеш-памяти. эффекты.

0
ответ дан 10 December 2019 в 02:45
поделиться

Это последовательные потоки битов - вы в основном потребляете их по одному биту за раз без произвольный доступ.

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

Я рекомендую использовать стандартную библиотеку для анализа этих битовых потоков.

Flavor является таким парсером, и на веб-сайте даже есть примеры MPEG-2 (PS) и различных частей H.264, таких как M-Coder. Flavor создает собственный код синтаксического анализа на языке, подобном C ++; вот цитата из спецификации MPEG-2 PS:

class TargetBackgroundGridDescriptor extends BaseProgramDescriptor : unsigned int(8) tag = 7 
{
    unsigned int(14) horizontal_size;
    unsigned int(14) vertical_size;
    unsigned int(4) aspect_ratio_information;
}

class VideoWindowDescriptor extends BaseProgramDescriptor : unsigned int(8) tag = 8 
{
    unsigned int(14) horizontal_offset;
    unsigned int(14) vertical_offset;
    unsigned int(4) window_priority;
}
1
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: