С нами лучше!
Оптимизируем видеокодек по быстродействию


Я не любитель что-то оптимизировать заранее. Как правило, при разработке программ, о быстродействии я не задумываюсь вовсе, сосредотачиваясь лишь на алгоритмах. Также было и в данном случае, до того момента, пока я не заметил, что мой компьютер не успевает перекодировать видеопоток в реальном времени. На несколько потоков процесс кодирования я не делил - это просто не нужно, т.к. в любом случае я планировал вещать несколько телеканалов. Соответственно, кодирование каждого из них было бы правильнее осуществлять в своём потоке, и делить процесс кодирования одного телеканала на несколько потоков не имело смысла. Сейчас пришло время заняться оптимизацией по быстродействию.

Итак, с помощью профайлера я посмотрел узкие места. В общем-то они совпали с ожидаемыми - это был модуль компенсации движения. Проанализировав математическую часть модуля, я не нашел никаких ошибок. Также мне не пришло ничего в голову и как его упростить. Тогда я пошел на крайние меры - я решил посмотреть ассемблерный код самой ресурсоёмкой части этого модуля и попытаться его оптимизировать. Каково же было моё удивление, когда я увидел, что ассемблерный код функции, которая потребляла 95% ресурсов модуля, состоял всего из двух ассемблерных инструкций, а такая нагрузка получалась за счет огромного числа вызовов данной функции. Ну не могло такого быть, я же прекрасно понимал логику работы алгоритма компенсации движения, и она никак не стыковалась с тем, что показывал анализатор и ассемблер. Как известно, чудес не бывает (хотя....), и я с еще большим усердием принялся за проверку логики работы модуля на соответствие выбранному алгоритму. Это дало свои плоды - оказалось, что я недостаточно тщательно проработал алгоритм. В итоге я в него заложил ряд вычислений, без которых вполне можно было бы и обойтись, и которые в то же время потребляли огромные ресурсы. Стоило устранить ошибку - и всё встало на свои места, производительность модуля увеличилась примерно на 100%.

Всё это полностью подтвердило мою точку зрения. В наше время компиляторы справляются с оптимизацией кода намного лучше человека, поэтому влазить в ассемблерные инструкции и что-то там оптимизировать просто никогда не имеет смысла. Основное внимание нужно обращать на используемые алгориты вычислений, а замена одного алгоритма на другой, либо его модернизация могут привести к намного большему выигрышу в производительности, чем попытки тупого переписывания си++ кода на ассемблер.

Игорь, Октябрь 2012.



Комментарии Оптимизируем видеокодек по быстродействию (1)
Скрыть комментарии
Комментарий от: Гость, от 19-12-2012 01:00,
Вы понимаете,что этой программой пользуются простые люди без специальной подготовки,как у Вас.Читать Ваши объяснения,как пользоваться TV-онлайн на 10 страницах - это издевательство просто.Пользовалась этой программой несколько лет,но сейчас ВЫ вынуждаете покинуть её.
 
» Ответить на комментарий...
» Посмотреть все ответы - 1

Добавить комментарий


Выбрать телеканал





Рейтинг@Mail.ru