понятия не имеет об оптимизации современных процессоров?
Попробуй скомпилить последним Delphi вот это: X := 0; Y := 0; Z := 0; Получишь: xor eax,eax mov [X],eax xor eax,eax mov [Y],eax xor eax,eax mov [Z],eax Оптимизация современного компилятора на лицо :))
Оптимизируется загрузкой в три параллельных потока исполнения.
Да ты их как бы сравни. Старые собирают быстрые бинарники, которые просто работают. Новые собирают задумчивые бинарники.
Кстати, по поводу этого кейса. С точки зрения производительности, эти асмы сработают за одно время. https://godbolt.org/z/6Wd7e1jxj Как раз потому, что действует переименование регистров и первый eax физически будет не соответствовать второму eax. Кстати, я не уверен, что 3 mov будут выполняться параллельно. Потому, что в теории указатели могут быть созависимы. Я не уверен, что в современных процессорах есть такая оптимизация - отслеживать непересекаемость адресов памяти. Но результат, который выдаёт GCC и Clang лучше просто потому, что занимает меньше места. Там команды тоже вычитываются блоками (по 16 байт вроде), и чем меньше равнозначных команд в блоке - тем проще их парсить.
Имхо, на таких кейсах бессмысленно что либо показывать в плане оптимизаций. Нужно смотреть либо хитрые числодробилки, где современные компили могут показать как они в векторизацию и современные инструкции могут. (Только надо указать, что компилим под современный процессор) Либо кейсы с кучей абстракций на современных крестах с констэкспрами и шаблонами (или на расте с трейтами, генераторами и лямбдами), где у оптимизатора будут все возможности показать как он оверхед от абстракций может убрать
Да уж миллион раз всё доказано и показано Это так, небольшой пример просто
Здесь mov зависит от xor, потому нет никакого смысла повторять xor'ы. Плюс, mov [x],0 занимает больше места, чем xor+mov.
Да, но зачем делать ещё ксоры?
Там компилятор родом из 90-х. Там практически нет оптимизаций с учитыванием ранее рассчитанных значений. А почему xor + mov вместо mov 0? На процессорах того периода это была более предпочтительная конструкция
11й тоже самое делает :)
Так он и не обновлялся с тех пор :)
Он и тогда особым умом не отличался. Периодически можно встретить конструкции типа: mov [esp-8],eax mov eax,[esp-8]
скомпилил и? я тебя удивлю - ровно такой-же код будет сгенерирован сишным компилером при отключенной оптимизации. А теперь включи оптимизацию и насладись :))))
var X, Y, Z: Longint; procedure test(var X, Y, Z: Longint); begin X := 0; Y := 0; Z := 0; end; test(X, Y, Z); 004266E8 53 push ebx Project1.dpr.21: X := 0; 004266E9 33DB xor ebx,ebx 004266EB 8918 mov [eax],ebx Project1.dpr.22: Y := 0; 004266ED 33C0 xor eax,eax 004266EF 8902 mov [edx],eax Project1.dpr.23: Z := 0; 004266F1 33C0 xor eax,eax 004266F3 8901 mov [ecx],eax Project1.dpr.24: end; 004266F5 5B pop ebx 004266F6 C3 ret Си: _test: # @test mov dword ptr [eax], 0 mov dword ptr [edx], 0 mov dword ptr [ecx], 0 ret
ты где оптимизацию то включил? :)
вот вот, сначала отвечаешь на один кусок кода, приводят совершенно другой, и лицо ладонь, дядя степа ты дурак? :)))
Какую оптимизацию нужно включить?
а в дельфе мало вариантов для маневра :)
Обсуждают сегодня