IAR V5.40.2.51604/W32
RVCT4.0 [Build 650]
(Sourcery G++ Lite 2009q1-161) 4.3.3
Задача:
распаковка LZMA из внутренней Flash, только распаковка, данные никуда не отсылаются.
запакованный размер - 244625
распакованный - 605992
размер словаря 8 кб
данные - прошивка от блекфина.
оптимизация максимальная по скорости
Платформа:
ARM - LPC2138
частота 50 Mhz MAM включен
размер кода (только декодер)
Код
IAR RVCT GNUC
ARM 3032 3284 3844
THUMB 2372 2514 2844
ARM 3032 3284 3844
THUMB 2372 2514 2844
Время выполнения в ms (измерял с помощью таймера с прескалером 0)
код выполнялся из памяти
Код
IAR RVCT GNUC
ARM 1754 1737 2212
THUMB 2720 2761 2494
ARM 1754 1737 2212
THUMB 2720 2761 2494
код из флеша
Код
IAR RVCT GNUC
ARM 1954 1950 2323
THUMB 2870 2942 2738
ARM 1954 1950 2323
THUMB 2870 2942 2738
В тумбе IAR генерит более быстрый и компактный код по сравнению с RVCT.
В ARM из flash разница в скорости ~0.2% что несущественно, а вот код ~8% компактнее.
С GNUC - интересно в тумбе код большой, но более быстрый. Посмотрел по листингу - это связано с тем что GNUC в тумбе использует r8, r9 ( r10,r11 не использовал)
PS - общий проект в IAR, разными компиляторами компилировал только функцию декодера, а т.к. все EABI, то IARовсикй линкер без проблем жрал. Поэтому измерение времени для разных компилеров корректно - именно время распаковки.