Пытаюсь написать несколько функций для работы с картинками. Понятно дело пытаюсь, оптимизировать, собственно к этому два замечания.
Сравнение оптимизации компиляторами MSVS 2003 и MSVS 2005
Один и тот же код (функция масштабирования ) компилирую на MSVS 2003 и MSVS 2005 (на 2008 не пробовал). Получаем вот такие графики скоростей (под скоростью здесь понимается размер результирующей картинки поделенный на время работы функции):
Что за всплески в точках меньших 1.0 - не знаю, пока не разбирался. В 1.0 и выше, критичная часть кода уже на ассемблере и компилятор роли не играет. Но очевидно, что народ в Микрософт не сидит сиднем и компиляторы оптимизируют код все лучше (хотя ручной настройкой можно добится существенных результатов)
Директива __forceinline
Директива __forceinline прекрасная вещь. Написал код все того же масштабирования померил время - получается отлично (я для сравнения использовал такие же функции из интеловской либы IPP - моя получилось в полтора раза быстрее, что меня вполне устраивало). Решил немного пооптимизировать код, в том числе одну из внутренних функций наградил директивой __forceinline, которая там смотрелась вполне к месту. Замерил время. Увеличилось в полтора, два раза. Так что дурное использование __forceinline может дать результаты обратные тем, которые предполагались.
3 комментария:
Сравни оптимизацию с 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
Как видишь - кернел тайм у обоих сборок практически идентичный. А вот юзер тайм (как раз сам код провайдера + рантайм) - очень даже разный.
Надо будет попробовать bcb как-нибудь. Спасибо за наводку. Я последний раз борландовым продуктом пользовался уже не вспомнить когда, и была это Дельфи 3.0, если мне не изменяет мой склероз:)
В целом про оптимизацию вопрос сложный. У меня основной список задач подверженных оптимизации это обработка изображений (и рядом с этим типа декодирование/кодировани из же). Честно говоря компиляторы в данном случае чаще всего не рулят, т.е. перевод кода на чистый асм дают 20-25% прироста по скорости, а если потом еще на все это дело навесить ССЕ и еще аккуратненько поработать с кешом проца, вполне реально получить прирост скорости в разы.
Например, делал простой поворот изображения (фактически массива байт) на 90 градусов, замена варианта "в лоб" на обработку изображения "полосами" дало двухкратный прирост.
Поставь лучше Intel C Compiler. Он совместим со студией. Увидишь много интересного
Отправить комментарий