Когда-то компилятор Watcom был лучшим в мире, с точки зрения скорости работы результирующего кода. В частности, им были скомпилированы такие шедевры своего времени как Duke Nukem 3D, Warcraft II и Doom.
Сейчас ситуация изменилась, с распространением 64-разрядных процессоров, да и 32-разрядных с SSE2-регистрами, в которые gcc автоматически делает предвыборку из памяти, если задать соответствующий ключик -march. Все эти фокусы старичку-ваткому не под силу.
Но даже для сборки под более широкий класс процессоров (Open)Watcom использовать уже не следует.
Смотрите:
В 486-х и первых пентиумах был такой недостаток дизайна - AGI (Address Generation Interlock). Это затык работы конвейера, когда одна команда работает с памятью с использованием адресации по базе или индексу (например mov по адресу 0x10), а предшествующая ей пишет в тот же регистр (например mov по адресу 0).
Три нопа по адресам 0x05, 0x0B, 0x0E - это "привет из 90-х", контрмеры против AGI. В современных процессорах (Pentium Pro+) уже нет AGI, а вот нопы по-прежнему кушают свои такты.
Лучше бы компилятор сделал здесь развёртку цикла.
Сейчас ситуация изменилась, с распространением 64-разрядных процессоров, да и 32-разрядных с SSE2-регистрами, в которые gcc автоматически делает предвыборку из памяти, если задать соответствующий ключик -march. Все эти фокусы старичку-ваткому не под силу.
Но даже для сборки под более широкий класс процессоров (Open)Watcom использовать уже не следует.
Смотрите:
/**
*
* @brief Очистить экран
*
*/
void UI_ClearScreen()
0000 void near UI_ClearScreen():
0000 B8 00 80 0B 00 mov eax,0x000b8000
0005 8D 80 00 00 00 00 lea eax,[eax]
000B 8D 52 00 lea edx,[edx]
000E 8B DB mov ebx,ebx
{
unsigned short* screen_buffer = (unsigned short*)VIDEO_MEMORY_ADDR;
for( unsigned int i = 0; i < TEXT_ROW_COUNT * TEXT_COLUMN_COUNT; ++i )
screen_buffer[i] = 0x0720;
0010 L$1:
0010 66 C7 00 20 07 mov word ptr [eax],0x0720
0015 83 C0 02 add eax,0x00000002
0018 3D A0 8F 0B 00 cmp eax,0x000b8fa0
001D 75 F1 jne L$1
}
001F C3 retВ 486-х и первых пентиумах был такой недостаток дизайна - AGI (Address Generation Interlock). Это затык работы конвейера, когда одна команда работает с памятью с использованием адресации по базе или индексу (например mov по адресу 0x10), а предшествующая ей пишет в тот же регистр (например mov по адресу 0).
Три нопа по адресам 0x05, 0x0B, 0x0E - это "привет из 90-х", контрмеры против AGI. В современных процессорах (Pentium Pro+) уже нет AGI, а вот нопы по-прежнему кушают свои такты.
Лучше бы компилятор сделал здесь развёртку цикла.
no subject
Date: 2011-06-02 09:38 pm (UTC)no subject
Date: 2011-06-02 09:56 pm (UTC)Но также для своего времени это был выдающийся оптимизирующий компилятор, очень тесно привязанный к особенностям архитектуры x86.
Особенно на фоне тогдашних конкурентов - Microsoft Quick C и Borland C++. У них качество генерации кода было ниже плинтуса.
Впрочем, даже сейчас watcom иногда обходит gcc по скорости работы сгенерированного кода. От icl и msvc он безнадёжно отстал, а из открытых компиляторов пальму первенства у gcc постепенно отбирает llvm, у которого и промежуточная оптимизация лучше, и язык описания машин мощнее, и промежуточное представление выбрано очень удачно - элегантно позволяет обойти ряд серьёзных проблем, и есть LTO, в общем окончательные похороны ваткома уже не за горами.
no subject
Date: 2011-06-03 03:47 am (UTC)а насчет нынешней ситуации -- создание хорошо оптимизирующего плюсового компилятора это чертовски затратное дело. кому сегодня нужен еще один компилятор?
no subject
Date: 2011-06-03 06:45 am (UTC)таким образом, индустрии нужен компилятор под BSD-лицензией, на базе которого можно делать производные работы с закрытыми исходниками
no subject
Date: 2011-06-03 06:53 am (UTC)нужен более свободный компилятор