Насмотревшись на баталии на форумах решил сделать для себя хоть какое не слишком эмоциональное сравнение мелкопроцессоров. Некоторые результаты оказались весьма неожиданными для меня, поэтому решил "опубликовать". Может кто меня подправит.
Участники (ну то что у меня самого есть, чего нет не брал):
классика avr@16MHz, msp430x2xxx@25MHz,stm8x(0/1)xx@16Mhz,stm8x2xx@24MHz,cortex-m(0/3/7)от stm32, esp8xxx, esp32, cortex от rtl.
Что сравниваю? Берем один и тот же простой код на С и смотрим ассемблер после компилятора. По нему считаем такты. Зная такты и частоту - нахожу время исполнения, и кроме того имею количество байт в которое это все превратилось.
Вот код который я подсунул компилятору:
Однако реально анализировать будем только вот это:
ac += bc; /* 8 бит */
ai += bi; /* 16 бит */
al += bl; /* 32 бит */
Остальное нужно просто для того чтобы компилятор не вздумал оптимизировать то, что его не просят.
Ясно что результат будет тот же что и у других арифметических и логических операций.
Компиляторы: SDCC для stm8 и gcc для всего остального.
В квадратных скобках - такты. Листинги я немного подправлял ручками чтобы сделать поединообразнее,
заменял вручную безликие адреса (в том числе относительные-что разумеется не корректно) на имена переменных (без учета режима адресации).
Но код не трогал.
Поехали.
Начнем с классики..
Команд: 29
Тактов: 71 (11/20/40) ТУТ И ДАЛЕЕ - сначала общее количество тактов потом отдельно на 8/16/32 битное сложение
Байт кода: 100
Тактовая частота: 16 МГц
Время исполнения: 4.43 мкс (0.69/1.25/2.5) ТУТ И ДАЛЕЕ - аналогично тактам
"Разочарование года".
Участники (ну то что у меня самого есть, чего нет не брал):
классика avr@16MHz, msp430x2xxx@25MHz,stm8x(0/1)xx@16Mhz,stm8x2xx@24MHz,cortex-m(0/3/7)от stm32, esp8xxx, esp32, cortex от rtl.
Что сравниваю? Берем один и тот же простой код на С и смотрим ассемблер после компилятора. По нему считаем такты. Зная такты и частоту - нахожу время исполнения, и кроме того имею количество байт в которое это все превратилось.
Вот код который я подсунул компилятору:
Код:
static char ac = 0;
static char bc = 1;
static int ai = 0;
static int bi = 1;
static long al = 0;
static long bl = 1;
static int counter;
int main(void)
{
for(counter = 0; counter < 10; counter++)
{
ac += bc;
ai += bi;
al += bl;
}
}
ac += bc; /* 8 бит */
ai += bi; /* 16 бит */
al += bl; /* 32 бит */
Остальное нужно просто для того чтобы компилятор не вздумал оптимизировать то, что его не просят.
Ясно что результат будет тот же что и у других арифметических и логических операций.
Компиляторы: SDCC для stm8 и gcc для всего остального.
В квадратных скобках - такты. Листинги я немного подправлял ручками чтобы сделать поединообразнее,
заменял вручную безликие адреса (в том числе относительные-что разумеется не корректно) на имена переменных (без учета режима адресации).
Но код не трогал.
Поехали.
Начнем с классики..
Код:
; test.c: 14: ac += bc;
3a: 80 91 68 00 [3] lds r24, _ac
3e: 98 2f [1] mov r25, r24
40: 80 91 60 00 [3] lds r24, _bc
44: 89 0f [1] add r24, r25
46: 80 93 68 00 [3] sts _ac, r24
; test.c: 15: ai += bi;
4a: 20 91 69 00 [3] lds r18, _ai
4e: 30 91 6a 00 [3] lds r19, _ai+1
52: 80 91 61 00 [3] lds r24, _bi
56: 90 91 62 00 [3] lds r25, _bi+1
5a: 82 0f [1] add r24, r18
5c: 93 1f [1] adc r25, r19
5e: 90 93 6a 00 [3] sts _ai+1, r25
62: 80 93 69 00 [3] sts _ai, r24
; test.c: 16: al += bl;
66: 20 91 6b 00 [3] lds r18, _al
6a: 30 91 6c 00 [3] lds r19, _al+1
6e: 40 91 6d 00 [3] lds r20, _al+2
72: 50 91 6e 00 [3] lds r21, _al+3
76: 80 91 63 00 [3] lds r24, _bl
7a: 90 91 64 00 [3] lds r25, _bl+1
7e: a0 91 65 00 [3] lds r26, _bl+2
82: b0 91 66 00 [3] lds r27, _bl+3
86: 82 0f [1] add r24, r18
88: 93 1f [1] adc r25, r19
8a: a4 1f [1] adc r26, r20
8c: b5 1f [1] adc r27, r21
8e: 80 93 6b 00 [3] sts _al, r24
92: 90 93 6c 00 [3] sts _al+1, r25
96: a0 93 6d 00 [3] sts _al+2, r26
9a: b0 93 6e 00 [3] sts _al+3, r27
Тактов: 71 (11/20/40) ТУТ И ДАЛЕЕ - сначала общее количество тактов потом отдельно на 8/16/32 битное сложение
Байт кода: 100
Тактовая частота: 16 МГц
Время исполнения: 4.43 мкс (0.69/1.25/2.5) ТУТ И ДАЛЕЕ - аналогично тактам
"Разочарование года".