Сравнение компиляторов для разработки на микроконтроллерах с ядром ARM Cortex-M

от автора


В этой статье протестируем 3-и компилятора для микроконтроллеров Kinetis с ядром Cortex-M4.
Запустим тесты CoreMark, Whetstone, Dhrystone.
Исследуем алгоритмы сжатия с минимальным потреблением ОЗУ и выясним как влияют на их быстродействие разные компиляторы.
И даже попытаемся узнать насколько отстает Kinetis по быстродействию от Intel Core I7.



Предыдущие статьи о разработке на микроконтроллерах Kinetis:

В статье “Начало разработки на микроконтроллерах Kinetis. Быстрый старт” была описана среда разработки Kinetis Design Studio v3.0.0 (KDS). Среда KDS использует в качестве инструмента компиляции и сборки программного обеспечения пакет GNU Tools for ARM Embedded Processors. Туда в частности входит компилятор GCC для ARM. Компилятор неплохой во всех смыслах. Но если мы посмотрим сколько существует у него ветвей в директории gcc.gnu.org/svn/gcc/branches, то увидим их более 300! Сколько же сил надо чтобы поддерживать такое огромное количество ветвей!? А ведь проект не коммерческий. С другой стороны серия ARM Cortex-M не мэйнстрим, не используются в смартфонах, к ним не привлечено так много внимания сообщества поддерживающего Open Source.

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

К счастью KDS обеспечена плагинами для конвертации под другие известные пакеты компиляции и сборки — Keil и IAR. Большинство демо-проектов для Kinetis сопровождается 3-мя конфигурациями для сборки средствами GCC, Keil и IAR. Однако в наборе программного обеспечения для Kinetis нет достаточно всеобъемлющего теста для сравнения этих инструментов компиляции между собой. Поэтому пришлось создать свой.
Проект создан в KDS с использованием плагина ProcessorExpert для микроконтроллера MK60FN1M0VLQ12 на плате представленной в статье “Умная плата для управления силовыми 3-х фазными нагрузками”

Вот экран проекта в KDS:

Что входит в пакет тестов

Проект Whetstone . Очень старый и простой тест производительности вычислений с плавающей точкой. Тест очень легко портируется и может выполняться на простейших микроконтроллерах. В нашем случае представлено две реализации: вариант вычислений c типом float и вариант с типом double. Это важно, поскольку в первом случае у Cortex-M4 используется сопроцессор, а во втором нет.

Проект Dhrystone. Тест производительности целочисленных операций. Типы float и double нигде не применяются. Тест тоже легко портируется и имеется огромный архив результатов для всевозможных микроконтроллеров и компьютеров.

Проект CoreMark. Современный тест, специально разработанный для встраиваемых систем. Может стать индустриальным стандартом. Его результаты сертифицируются организацией EEMBC, а значит защищены в какой-то мере от читинга и фальсификации.
Результаты теста CoreMark вызывают наибольшее доверие при комплексном тестировании производительности микроконтроллеров и сравнении компиляторов. На нем в принципе можно было бы и ограничится, но тесты сами по себе не несут никакой практической пользы для встраиваемых приложений, и чтобы придать большее прикладное значение этим тестам я добавил еще тестирование алгоритмов сжатия.

Для начала пришлось найти подходящий менеджер памяти (менеджер кучи или heap).

Проект umm_malloc. Нашелся на Github. С виду показался вполне подходящим. Стандартный менеджер кучи из библиотеки C-и я использовать отказался по двум причинам. Во-первых, в каждой из сред Keil, IAR, GCC будет своя библиотека кучи и не хотелось тратить время на исследование особенностей каждой из них. Во-вторых, алгоритмы сжатия критически зависят от объемы выделяемой им памяти. А памяти в обрез. Нужен был механизм точного контроля выделяемой памяти. И здесь umm_malloc предоставляет такую возможность. А попутно мы протестируем и быстродействие самого алгоритма umm_malloc.

Алгоритмы сжатия

Все алгоритмы пришлось подстраивать для того чтобы они использовали как можно меньше ОЗУ.
Сколько памяти нужно этим алгоритмам, насколько они могут сжать данные и каково их быстродействие можно посмотреть в результатах тестов и в листинге вывода в терминал.

А вот результаты:

-У всех компиляторов была включена опция максимальной оптимизации. Точный состав опций можно посмотреть в прилагающемся проекте.
-Алгоритмы сжатия сжимали участок бинарного кода прошивки, полученной из проекта этого теста, скомпилированного в IAR.
-Время компиляции GCC измерено при компиляции из среды KDS.
-Помимо скорости работы алгоритмов также в таблицу вставлены строчки с дополнительными важными для разработчика метриками, это: время полной перекомпиляции проекта, размер бинарного файла при оптимизации по скорости и размер бинарного файла при оптимизации по размеру.

Вывод в терминал результатов теста скомпилированного в IAR

----------- Speed Test -------------   Reference time = 100001 us  ----------- umm malloc test ------------- ........................................................... |0x1fff1b44|B     0|NB     1|PB     0|Z     1|NF     1|PF     0|USED |0x1fff1b4c|B     1|NB  4223|PB     0|Z  4222|NF  4223|PF     0|FREE |0x1fff9f3c|B  4223|NB     0|PB     1|Z     1|NF     0|PF     1|USED ........................................................... Total Entries     1    Used Entries      0    Free Entries      1 Total Blocks   4223    Used Blocks       0    Free Blocks    4223                        Used space =      0    Free space =  33784 ...........................................................  umm malloc test   time  = 1447071 uS Allocations =  40000, uSec per allocation = 36  ----------- Compressor LZSS test ------------- Uncompressed size = 2048 Compressed   size = 1858. Max. alloc.= 14384. Time = 6627 uS Decompress                Max. alloc.= 1048. Time = 981 uS Decompress Ok!  ----------- Compressor Zlib test ------------- Uncompressed size = 2048 Compressed   size = 1740. Max. alloc.= 24288. Time = 12179 uS Decompress                Max. alloc.= 15768. Time = 764 uS Decompress Ok!  ----------- Compressor S-LZW test ------------- Uncompressed size = 2048 Compressed   size = 2035. Max. alloc.= 4320. Time = 2542 uS Decompress                Max. alloc.= 4320. Time = 3816 uS Decompress Ok!  ----------- Compressor FastLZ test ------------- Uncompressed size = 2048 Compressed   size = 1834. Max. alloc.= 32776. Time = 1010 uS Decompress                Max. alloc.= 0. Time = 152 uS Decompress Ok!   ----------- WHETSTONE FLOAT -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679254770278930664   xx2  = -0.46633863449096679688   xx3  = -0.73303699493408203125   xx4  = -1.13254797458648681641 .........MODULE 2:  array elements.......   e10  = -0.06834230571985244751   e11  = -0.46263590455055236816   e12  = -0.72971796989440917969   e13  = -1.12397670745849609375 .........MODULE 3:  array as parameter...   e1_0 = -0.05533060804009437561   e1_1 = -0.44743216037750244141   e1_2 = -0.71096724271774291992   e1_3 = -1.10309338569641113281 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49041154980659484863   y1   = 0.49039667844772338867 .........MODULE 8:  procedure calls......   z    = 0.99993747472763061523 .........MODULE9:  array references......   e1_j = -1.10309338569641113281   e1_k = 3.00000000000000000000   e1_l = -1.10309338569641113281 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466047048568725586 ........................................ Whetstone last    time (uS) = 10960.00 Whetstone max     time (uS) = 10961.00 Whetstone min     time (uS) = 10960.00   ----------- WHETSTONE DOUBLE -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679268039452399826   xx2  = -0.46633881454398036003   xx3  = -0.73303694842681344599   xx4  = -1.13254799829068817198 .........MODULE 2:  array elements.......   e10  = -0.06834219862995164003   e11  = -0.46263765626356890425   e12  = -0.72971838784369053319   e13  = -1.12397907004612833261 .........MODULE 3:  array as parameter...   e1_0 = -0.05533645259179445915   e1_1 = -0.44743656275474680588   e1_2 = -0.71097338928518248722   e1_3 = -1.10309805692560095340 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040731615907084197   y1   = 0.49039249795612543821 .........MODULE 8:  procedure calls......   z    = 0.99993750062499996275 .........MODULE9:  array references......   e1_j = -1.10309805692560095340   e1_k = 3.00000000000000000000   e1_l = -1.10309805692560095340 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466551951904967427 ........................................ Whetstone last    time (uS) = 142583.00 Whetstone max     time (uS) = 142583.00 Whetstone min     time (uS) = 142582.00   ----------- DHRYSTONE 2 -------------   Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Execution starts, 20000 runs through Dhrystone                                               Execution ends Final values of the variables used in the benchmark: Int_Glob:            5         should be:   5 Bool_Glob:           1         should be:   1 Ch_1_Glob:           A         should be:   A Ch_2_Glob:           B         should be:   B Arr_1_Glob[8]:       7         should be:   7 Arr_2_Glob[8][7]:    20010         should be:   Number_Of_Runs + 10 Ptr_Glob->   Ptr_Comp:          536867932         should be:   (implementation-dependent)   Discr:             0         should be:   0   Enum_Comp:         2         should be:   2   Int_Comp:          17         should be:   17   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob->   Ptr_Comp:          536867932         should be:   (implementation-dependent), same as above   Discr:             0         should be:   0   Enum_Comp:         1         should be:   1   Int_Comp:          18         should be:   18   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Int_1_Loc:           5         should be:   5 Int_2_Loc:           13         should be:   13 Int_3_Loc:           7         should be:   7 Enum_Loc:            1         should be:   1 Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING         should be:   DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING         should be:   DHRYSTONE PROGRAM, 2'ND STRING Time = 93000 us Microseconds for one run through Dhrystone: 4.65 Dhrystones per Second:                      215053   ----------- COREMARK -------------  2K performance run parameters for coremark. CoreMark Size    : 666 Total ticks      : 29079282 Total time (secs): 29.079282 Iterations/Sec   : 343.887445 Iterations       : 10000 Compiler version : IAR 7.40.7 Compiler flags   :  -O3 -Otime Memory location  : IRAM seedcrc          : 0xe9f5 [0]crclist       : 0xe714 [0]crcmatrix     : 0x1fd7 [0]crcstate      : 0x8e3a [0]crcfinal      : 0x988c Correct operation validated. See readme.txt for run and reporting rules. CoreMark 1.0 : 343.887445 / IAR 7.40.7  -O3 -Otime / IRAM  END. 

Вывод в терминал результатов теста скомпилированного в Keil

----------- Speed Test -------------   Reference time = 100001 us  ----------- umm malloc test ------------- ........................................................... |0x1fff60f8|B     0|NB     1|PB     0|Z     1|NF     1|PF     0|USED |0x1fff6100|B     1|NB  4223|PB     0|Z  4222|NF  4223|PF     0|FREE |0x1fffe4f0|B  4223|NB     0|PB     1|Z     1|NF     0|PF     1|USED ........................................................... Total Entries     1    Used Entries      0    Free Entries      1 Total Blocks   4223    Used Blocks       0    Free Blocks    4223                        Used space =      0    Free space =  33784 ...........................................................  umm malloc test   time  = 1507118 uS Allocations =  40000, uSec per allocation = 37  ----------- Compressor LZSS test ------------- Uncompressed size = 2048 Compressed   size = 1858. Max. alloc.= 14384. Time = 7406 uS Decompress                Max. alloc.= 1048. Time = 989 uS Decompress Ok!  ----------- Compressor Zlib test ------------- Uncompressed size = 2048 Compressed   size = 1740. Max. alloc.= 24288. Time = 11716 uS Decompress                Max. alloc.= 15768. Time = 912 uS Decompress Ok!  ----------- Compressor S-LZW test ------------- Uncompressed size = 2048 Compressed   size = 2035. Max. alloc.= 4320. Time = 2839 uS Decompress                Max. alloc.= 4320. Time = 4194 uS Decompress Ok!  ----------- Compressor FastLZ test ------------- Uncompressed size = 2048 Compressed   size = 1834. Max. alloc.= 32776. Time = 1028 uS Decompress                Max. alloc.= 0. Time = 160 uS Decompress Ok!   ----------- WHETSTONE FLOAT -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679254770278930700   xx2  = -0.46633863449096680000   xx3  = -0.73303699493408203000   xx4  = -1.13254797458648680000 .........MODULE 2:  array elements.......   e10  = -0.06834230571985244800   e11  = -0.46263590455055237000   e12  = -0.72971796989440918000   e13  = -1.12397670745849610000 .........MODULE 3:  array as parameter...   e1_0 = -0.05533060804009437600   e1_1 = -0.44743216037750244000   e1_2 = -0.71096724271774292000   e1_3 = -1.10309338569641110000 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040567874908447000   y1   = 0.49039086699485779000 .........MODULE 8:  procedure calls......   z    = 0.99993747472763062000 .........MODULE9:  array references......   e1_j = -1.10309338569641110000   e1_k = 3.00000000000000000000   e1_l = -1.10309338569641110000 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466011285781860000 ........................................ Whetstone last    time (uS) = 08925.00 Whetstone max     time (uS) = 08926.00 Whetstone min     time (uS) = 08925.00   ----------- WHETSTONE DOUBLE -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679268039452399000   xx2  = -0.46633881454398041000   xx3  = -0.73303694842681344000   xx4  = -1.13254799829068810000 .........MODULE 2:  array elements.......   e10  = -0.06834219862995163900   e11  = -0.46263765626356895000   e12  = -0.72971838784369047000   e13  = -1.12397907004612830000 .........MODULE 3:  array as parameter...   e1_0 = -0.05533645259179446200   e1_1 = -0.44743656275474680000   e1_2 = -0.71097338928518250000   e1_3 = -1.10309805692560080000 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040731615903904000   y1   = 0.49039249795609352000 .........MODULE 8:  procedure calls......   z    = 0.99993750062499998000 .........MODULE9:  array references......   e1_j = -1.10309805692560080000   e1_k = 3.00000000000000000000   e1_l = -1.10309805692560080000 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466551951905033000 ........................................ Whetstone last    time (uS) = 166298.00 Whetstone max     time (uS) = 166298.00 Whetstone min     time (uS) = 166298.00   ----------- DHRYSTONE 2 -------------   Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Execution starts, 20000 runs through Dhrystone                                               Execution ends Final values of the variables used in the benchmark: Int_Glob:            5         should be:   5 Bool_Glob:           1         should be:   1 Ch_1_Glob:           A         should be:   A Ch_2_Glob:           B         should be:   B Arr_1_Glob[8]:       7         should be:   7 Arr_2_Glob[8][7]:    20010         should be:   Number_Of_Runs + 10 Ptr_Glob->   Ptr_Comp:          536870816         should be:   (implementation-dependent)   Discr:             0         should be:   0   Enum_Comp:         2         should be:   2   Int_Comp:          17         should be:   17   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob->   Ptr_Comp:          536870816         should be:   (implementation-dependent), same as above   Discr:             0         should be:   0   Enum_Comp:         1         should be:   1   Int_Comp:          18         should be:   18   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Int_1_Loc:           5         should be:   5 Int_2_Loc:           13         should be:   13 Int_3_Loc:           7         should be:   7 Enum_Loc:            1         should be:   1 Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING         should be:   DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING         should be:   DHRYSTONE PROGRAM, 2'ND STRING Time = 91000 us Microseconds for one run through Dhrystone: 4.55 Dhrystones per Second:                      219780   ----------- COREMARK -------------  2K performance run parameters for coremark. CoreMark Size    : 666 Total ticks      : 37386523 Total time (secs): 37.386523 Iterations/Sec   : 267.476064 Iterations       : 10000 Compiler version : armcc V5.06 (build 20) Compiler flags   :  -O3 -Otime Memory location  : IRAM seedcrc          : 0xe9f5 [0]crclist       : 0xe714 [0]crcmatrix     : 0x1fd7 [0]crcstate      : 0x8e3a [0]crcfinal      : 0x988c Correct operation validated. See readme.txt for run and reporting rules. CoreMark 1.0 : 267.476064 / armcc V5.06 (build 20)  -O3 -Otime / IRAM  END. 

Вывод в терминал результатов теста скомпилированного в GCC

----------- Speed Test -------------   Reference time = 100001 us  ----------- umm malloc test ------------- ........................................................... |0x1fff5280|B     0|NB     1|PB     0|Z     1|NF     1|PF     0|USED |0x1fff5288|B     1|NB  4223|PB     0|Z  4222|NF  4223|PF     0|FREE |0x1fffd678|B  4223|NB     0|PB     1|Z     1|NF     0|PF     1|USED ........................................................... Total Entries     1    Used Entries      0    Free Entries      1 Total Blocks   4223    Used Blocks       0    Free Blocks    4223                        Used space =      0    Free space =  33784 ...........................................................  umm malloc test   time  = 983944 uS Allocations =  40000, uSec per allocation = 24  ----------- Compressor LZSS test ------------- Uncompressed size = 2048 Compressed   size = 1858. Max. alloc.= 14384. Time = 8504 uS Decompress                Max. alloc.= 1048. Time = 673 uS Decompress Ok!  ----------- Compressor Zlib test ------------- Uncompressed size = 2048 Compressed   size = 1740. Max. alloc.= 24288. Time = 12384 uS Decompress                Max. alloc.= 15768. Time = 1070 uS Decompress Ok!  ----------- Compressor S-LZW test ------------- Uncompressed size = 2048 Compressed   size = 2035. Max. alloc.= 4320. Time = 2577 uS Decompress                Max. alloc.= 4320. Time = 4189 uS Decompress Ok!  ----------- Compressor FastLZ test ------------- Uncompressed size = 2048 Compressed   size = 1834. Max. alloc.= 32776. Time = 1045 uS Decompress                Max. alloc.= 0. Time = 234 uS Decompress Ok!   ----------- WHETSTONE FLOAT -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679254770278930664   xx2  = -0.46633863449096679688   xx3  = -0.73303699493408203125   xx4  = -1.13254797458648681641 .........MODULE 2:  array elements.......   e10  = -0.06834230571985244751   e11  = -0.46263590455055236816   e12  = -0.72971796989440917969   e13  = -1.12397670745849609375 .........MODULE 3:  array as parameter...   e1_0 = -0.05533138290047645569   e1_1 = -0.44743290543556213379   e1_2 = -0.71096915006637573242   e1_3 = -1.10309529304504394531 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040564894676208496   y1   = 0.49039086699485778809 .........MODULE 8:  procedure calls......   z    = 0.99993747472763061523 .........MODULE9:  array references......   e1_j = -1.10309529304504394531   e1_k = 3.00000000000000000000   e1_l = -1.10309529304504394531 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466064929962158203 ........................................ Whetstone last    time (uS) = 13629.00 Whetstone max     time (uS) = 13630.00 Whetstone min     time (uS) = 13629.00   ----------- WHETSTONE DOUBLE -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679268039452398997   xx2  = -0.46633881454398040667   xx3  = -0.73303694842681343946   xx4  = -1.13254799829068808492 .........MODULE 2:  array elements.......   e10  = -0.06834219862995163930   e11  = -0.46263765626356895266   e12  = -0.72971838784369047470   e13  = -1.12397907004612829240 .........MODULE 3:  array as parameter...   e1_0 = -0.05533645259179446191   e1_1 = -0.44743656275474680273   e1_2 = -0.71097338928518249990   e1_3 = -1.10309805692560081170 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040731615904653573   y1   = 0.49039249795610123650 .........MODULE 8:  procedure calls......   z    = 0.99993750062499997533 .........MODULE9:  array references......   e1_j = -1.10309805692560081170   e1_k = 3.00000000000000000000   e1_l = -1.10309805692560081170 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466551951905032514 ........................................ Whetstone last    time (uS) = 219895.00 Whetstone max     time (uS) = 219895.00 Whetstone min     time (uS) = 219894.00   ----------- DHRYSTONE 2 -------------   Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Execution starts, 20000 runs through Dhrystone                                               Execution ends Final values of the variables used in the benchmark: Int_Glob:            5         should be:   5 Bool_Glob:           1         should be:   1 Ch_1_Glob:           A         should be:   A Ch_2_Glob:           B         should be:   B Arr_1_Glob[8]:       7         should be:   7 Arr_2_Glob[8][7]:    20010         should be:   Number_Of_Runs + 10 Ptr_Glob->   Ptr_Comp:          536870792         should be:   (implementation-dependent)   Discr:             0         should be:   0   Enum_Comp:         2         should be:   2   Int_Comp:          17         should be:   17   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob->   Ptr_Comp:          536870792         should be:   (implementation-dependent), same as above   Discr:             0         should be:   0   Enum_Comp:         1         should be:   1   Int_Comp:          18         should be:   18   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Int_1_Loc:           5         should be:   5 Int_2_Loc:           13         should be:   13 Int_3_Loc:           7         should be:   7 Enum_Loc:            1         should be:   1 Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING         should be:   DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING         should be:   DHRYSTONE PROGRAM, 2'ND STRING Time = 74000 us Microseconds for one run through Dhrystone: 3.70 Dhrystones per Second:                      270270   ----------- COREMARK -------------  2K performance run parameters for coremark. CoreMark Size    : 666 Total ticks      : 45291107 Total time (secs): 45.291107 Iterations/Sec   : 220.793897 Iterations       : 10000 Compiler version : GCC4.8.4 20140725 (release) [ARM/embedded-4_8-branch revision 213147] Compiler flags   :  -O3 -Otime Memory location  : IRAM seedcrc          : 0xe9f5 [0]crclist       : 0xe714 [0]crcmatrix     : 0x1fd7 [0]crcstate      : 0x8e3a [0]crcfinal      : 0x988c Correct operation validated. See readme.txt for run and reporting rules. CoreMark 1.0 : 220.793897 / GCC4.8.4 20140725 (release) [ARM/embedded-4_8-branch revision 213147]  -O3 -Otime / IRAM  END. 

Вывод в терминал результатов теста запущенного в Visual Studio 2015

----------- Speed Test -------------   Reference time = 100000 us  ----------- umm malloc test ------------- ........................................................... |0x00ba5980|B     0|NB     1|PB     0|Z     1|NF     1|PF     0|USED |0x00ba5988|B     1|NB  4223|PB     0|Z  4222|NF  4223|PF     0|FREE |0x00badd78|B  4223|NB     0|PB     1|Z     1|NF     0|PF     1|USED ........................................................... Total Entries     1    Used Entries      0    Free Entries      1 Total Blocks   4223    Used Blocks       0    Free Blocks    4223                        Used space =      0    Free space =  33784 ...........................................................  umm malloc test   time  = 13586 uS Allocations =  40000, uSec per allocation = 0  ----------- Compressor LZSS test ------------- Uncompressed size = 2048 Compressed   size = 1858. Max. alloc.= 14384. Time = 146 uS Decompress                Max. alloc.= 1048. Time = 10 uS Decompress Ok!  ----------- Compressor Zlib test ------------- Uncompressed size = 2048 Compressed   size = 1740. Max. alloc.= 24288. Time = 241 uS Decompress                Max. alloc.= 15768. Time = 20 uS Decompress Ok!  ----------- Compressor S-LZW test ------------- Uncompressed size = 2048 Compressed   size = 2035. Max. alloc.= 4320. Time = 47 uS Decompress                Max. alloc.= 4320. Time = 31 uS Decompress Ok!  ----------- Compressor FastLZ test ------------- Uncompressed size = 2048 Compressed   size = 1834. Max. alloc.= 32776. Time = 13 uS Decompress                Max. alloc.= 0. Time = 4 uS Decompress Ok!   ----------- WHETSTONE FLOAT -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679254770278930700   xx2  = -0.46633863449096680000   xx3  = -0.73303699493408203000   xx4  = -1.13254797458648680000 .........MODULE 2:  array elements.......   e10  = -0.06834230571985244800   e11  = -0.46263590455055237000   e12  = -0.72971796989440918000   e13  = -1.12397670745849610000 .........MODULE 3:  array as parameter...   e1_0 = -0.05533060804009437600   e1_1 = -0.44743216037750244000   e1_2 = -0.71096724271774292000   e1_3 = -1.10309338569641110000 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040612578392029000   y1   = 0.49039128422737122000 .........MODULE 8:  procedure calls......   z    = 0.99993747472763062000 .........MODULE9:  array references......   e1_j = -1.10309338569641110000   e1_k = 3.00000000000000000000   e1_l = -1.10309338569641110000 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466225862503052000 ........................................ Whetstone last    time (uS) = 00131.00 Whetstone max     time (uS) = 00168.00 Whetstone min     time (uS) = 00123.00   ----------- WHETSTONE DOUBLE -------------  .........MODULE 1:  simple identifiers...   xx1  = -0.06679268039452399000   xx2  = -0.46633881454398041000   xx3  = -0.73303694842681344000   xx4  = -1.13254799829068810000 .........MODULE 2:  array elements.......   e10  = -0.06834219862995163900   e11  = -0.46263765626356895000   e12  = -0.72971838784369047000   e13  = -1.12397907004612830000 .........MODULE 3:  array as parameter...   e1_0 = -0.05533645259179446200   e1_1 = -0.44743656275474680000   e1_2 = -0.71097338928518250000   e1_3 = -1.10309805692560080000 .........MODULE 4:  conditional jumps....   val  = 1 .........MODULE 6:  integer arithmetic...   e1k  = 6.00000000000000000000   e1l  = 6.00000000000000000000 .........MODULE 7:  trig. functions......   x1   = 0.49040731615904543000   y1   = 0.49039249795610007000 .........MODULE 8:  procedure calls......   z    = 0.99993750062499998000 .........MODULE9:  array references......   e1_j = -1.10309805692560080000   e1_k = 3.00000000000000000000   e1_l = -1.10309805692560080000 .........MODULE10:  integer arithmetic...   j    = 2   k    = 3 .........MODULE11:  standard functions...   x    = 0.83466551951905787000 ........................................ Whetstone last    time (uS) = 00152.00 Whetstone max     time (uS) = 00186.00 Whetstone min     time (uS) = 00142.00   ----------- DHRYSTONE 2 -------------   Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Execution starts, 20000 runs through Dhrystone Execution ends Final values of the variables used in the benchmark: Int_Glob:            5         should be:   5 Bool_Glob:           1         should be:   1 Ch_1_Glob:           A         should be:   A Ch_2_Glob:           B         should be:   B Arr_1_Glob[8]:       7         should be:   7 Arr_2_Glob[8][7]:    20010         should be:   Number_Of_Runs + 10 Ptr_Glob->   Ptr_Comp:          3602560         should be:   (implementation-dependent)   Discr:             0         should be:   0   Enum_Comp:         2         should be:   2   Int_Comp:          17         should be:   17   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob->   Ptr_Comp:          3602560         should be:   (implementation-dependent), same as above   Discr:             0         should be:   0   Enum_Comp:         1         should be:   1   Int_Comp:          18         should be:   18   Str_Comp:          DHRYSTONE PROGRAM, SOME STRING         should be:   DHRYSTONE PROGRAM, SOME STRING Int_1_Loc:           5         should be:   5 Int_2_Loc:           13         should be:   13 Int_3_Loc:           7         should be:   7 Enum_Loc:            1         should be:   1 Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING         should be:   DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING         should be:   DHRYSTONE PROGRAM, 2'ND STRING Time = 551 us Microseconds for one run through Dhrystone: 0.03 Dhrystones per Second:                      36297640   ----------- COREMARK -------------  2K performance run parameters for coremark. CoreMark Size    : 666 Total ticks      : 11012043 Total time (secs): 11.012043 Iterations/Sec   : 9080.967083 Iterations       : 100000 Compiler version : VS 2013 Compiler flags   :  -O3 -Otime Memory location  : IRAM seedcrc          : 0xe9f5 [0]crclist       : 0xe714 [0]crcmatrix     : 0x1fd7 [0]crcstate      : 0x8e3a [0]crcfinal      : 0xd340 Correct operation validated. See readme.txt for run and reporting rules. CoreMark 1.0 : 9080.967083 / VS 2015  -O3 -Otime / IRAM  END. 

Как тут оказался Intel Core i7

Дело в том, что все алгоритмы сжатия и менеджер памяти отлаживались в среде Visual Studio и это процессор моего компьютера. В архиве есть директория SpeedTest_VS, где содержится проект для Visual Studio 2015 и в котором можно при желании продолжить совершенствование данных алгоритмов.

Вывод

IAR оказался безусловным лидером рейтинга. Самое удивительно что, сохраняя эффективность кода IAR также лидер и по скорости компиляции. Неучтенная здесь ложка дёгтя в том, что IAR поставляется с довольно мало функциональным редактором исходных текстов. Можно конечно запускать компиляцию инструментами IAR прямо из среды KDS, поскольку KDS это тот же слегка модифицированный Eclipse версии Mylyn. Но время перекомпиляции тогда увеличивается до 2 мин! У Eclipse тоже есть недостаток, он медленно открывается, с некоторого размера исходников у него начинает тормозиться контекстный парсинг. В проекте данного теста есть директория SpeedTest_SE. Там содержится файл SpeedTest.vpw рабочего пространства проекта данного теста для редактора SlickEdit. SlickEdit прекрасный, очень быстрый редактор, а IAR IDE умеет автоматически отслеживать изменения файлов, поэтому не возникает проблем в их совместном использовании.

Полный архив проекта (97.7 MB) доступен по ссылке https://drive.google.com/file/d/0B5dbvc_yPqJHYWI0OE9YZklKRjQ/view?usp=sharing

ссылка на оригинал статьи http://geektimes.ru/post/264558/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *