четверг, 18 декабря 2008 г.

Про оптимизацию компилятором

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

Сравнение оптимизации компиляторами MSVS 2003 и MSVS 2005


Один и тот же код (функция масштабирования ) компилирую на MSVS 2003 и MSVS 2005 (на 2008 не пробовал). Получаем вот такие графики скоростей (под скоростью здесь понимается размер результирующей картинки поделенный на время работы функции):



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

Директива __forceinline


Директива __forceinline прекрасная вещь. Написал код все того же масштабирования померил время - получается отлично (я для сравнения использовал такие же функции из интеловской либы IPP - моя получилось в полтора раза быстрее, что меня вполне устраивало). Решил немного пооптимизировать код, в том числе одну из внутренних функций наградил директивой __forceinline, которая там смотрелась вполне к месту. Замерил время. Увеличилось в полтора, два раза. Так что дурное использование __forceinline может дать результаты обратные тем, которые предполагались.

3 комментария:

Dmitry Kovalenko комментирует...

Сравни оптимизацию с BCB5 ;)

Чтобы там не говорили - а бинарники билдера реально могут работать в несколько раз быстрее чем супер-пупер оптимизированный код из под VS2005 SP1

Вот результаты тестирования одного модуля (www.ibprovider.com):

[summary] ++++++++++++++++++++++++++++
IBP x3 [VC8 SP1. Full optimization]

[summary] TESTS TIMES
[summary]
[summary] TOTAL USER TIME:498423195
[summary] TOTAL KERNEL TIME:119340765
[summary] TOTAL TIME :617763960

[summary] ++++++++++++++++++++++++++++
IBP v3 [BCB5 Free Compiler. Enable Inline]

[summary] TESTS TIMES
[summary]
[summary] TOTAL USER TIME:274561760
[summary] TOTAL KERNEL TIME:121056776
[summary] TOTAL TIME :395618536

Как видишь - кернел тайм у обоих сборок практически идентичный. А вот юзер тайм (как раз сам код провайдера + рантайм) - очень даже разный.

Vladimir комментирует...

Надо будет попробовать bcb как-нибудь. Спасибо за наводку. Я последний раз борландовым продуктом пользовался уже не вспомнить когда, и была это Дельфи 3.0, если мне не изменяет мой склероз:)

В целом про оптимизацию вопрос сложный. У меня основной список задач подверженных оптимизации это обработка изображений (и рядом с этим типа декодирование/кодировани из же). Честно говоря компиляторы в данном случае чаще всего не рулят, т.е. перевод кода на чистый асм дают 20-25% прироста по скорости, а если потом еще на все это дело навесить ССЕ и еще аккуратненько поработать с кешом проца, вполне реально получить прирост скорости в разы.

Например, делал простой поворот изображения (фактически массива байт) на 90 градусов, замена варианта "в лоб" на обработку изображения "полосами" дало двухкратный прирост.

Unknown комментирует...

Поставь лучше Intel C Compiler. Он совместим со студией. Увидишь много интересного