Берем простой, хотя и нетривиальный си-шный код, и сравниваем количество получившихся машинных команд. Компилятор GCC 4.1.2, оптимизация -O1. Исходный код такой:
unsigned long rot13_hash (unsigned char *str, unsigned int len)
{
unsigned long hash = 0;
while (len-- > 0) {
hash += *str++;
hash -= (hash << 13) | (hash >> 19);
}
return hash;
}
Результаты:
Архитектура | Команд в цикле | Всего команд |
---|
ARM | 6 | 13 |
Thumb | 8 | 17 |
MIPS32 | 9 | 17 |
Intel 386 | 9 | 25 |
MIPS16 | 10 | 17 |
Blackfin | 11 | 22 |
Для MIPS и Blackfin компилятор не догадался заменить два арифметических сдвига на один циклический. Предположим, мы исправили компилятор. Тогда получится так:
Архитектура | Команд в цикле | Всего команд |
---|
ARM | 6 | 13 |
MIPS32 | 7 | 15 |
MIPS16 | 8 | 15 |
Thumb | 8 | 17 |
Blackfin | 8 | 19 |
Intel 386 | 9 | 25 |
Хорошо видно, насколько архитектура Intel 386, она же Pentium, проигрывает RISC-процессорам.
no subject
no subject
Не верю. Насколько я понимаю, предсказанный переход на адрес, который уже во внутреннем представлении - бесплатный, да и суперскалярность никто не отменял. Ну и -Os тоже никто не отменял:
no subject
Легенда про четыре команды на такт возникла из того, что в Pentium 4 АЛУ работает по обоим фронтам синхросигнала. И таких АЛУ аж два. Реально померять что-то не представляется возможным, слишком всё замешано в кучу с трансляцией, VLIW, кэшами и т.п. Можно рассуждать только статистически. Из каких-то бенчмарков я слышал цифру про ~1 такт на команду, но отстаивать не берусь.
no subject
Кстати, i386 ты тоже поставил циклический сдвиг, или нет?
Теперь - про размер команд. CISC почти в два раза компактней, чем RISC. VLIW, соответственно, в два раза хуже RISC, а TTA - вдвое хуже VLIW. ;)
Правда, не на этом, твоем специально подобранном коде. ;)
no subject
На i386 компилятор сам, я не вмешивался. :)
Компактность кода это отдельный вопрос. Вот, к примеру, размер кода embedded-реализации TCP/IP для трех архитектур. Компилятор GCC 4.1.2, оптимизация "-Os". В байтах:
- Thumb - 14377
- i386 - 20862
- ARM - 21017
Нечетные значения - по причине размещения текстовых строк в том же сегменте, кто и код. Интел не сильно лучше чем ARM, а 16-битный Thumb заметно компактнее.