Да нет, просто использует более выгодный по скорости порядок и состав инструкций.
Поскольку я - зануда, то как вцеплюсь - не отстаю. А кто мне мешает этот же "более выгодный по скорости порядок и состав инструкций" расписать на асме во вставке? Я вот голословно утверждаю, что умный компилятор может разработать код, который по быстродействию не хуже сделанного на асме (умным программистом), но чтобы лучше - для этого нет никаких предпосылок.
А кто мне мешает этот же "более выгодный по скорости порядок и состав инструкций" расписать на асме во вставке?
Никто не мешает, но в данном случае вы этого не сделали. Результат компилятора с -O3 быстрее оказался.
В данном случае компилятор применил разворачивание цикла. Команд больше, а выполняются быстрее. Есть и другие методы оптимизации. А главное, достаточно поменять ключ оптимизации и не надо переписывать вставку.
Я бы сделал, но это не особо занимало. Ничего бы разворачивать не стал, разместил бы один, по крайней мере, массив на грани 256-байтного сегмента (ведь сказано было - это возможно), и парметром цикла был бы ZL, не проверяя ZН и не используя отдельный счётчик. Было бы, как минимум, не медленнее. Но мне лень что-то доказывать, в чём я сам уверен.
Код:
LDI ZL,low(Array1) LDI ZH,highArray1) LDI YL,low(Array2) LDI YH,high(Array2) lab: ld R16,z+ ld R1,y+ sub R16.R1 brne out_cycle cpi ZL,low(Array1+40) brlo lab out_cycle: tst R16 ; вот сюда мы придём с 0 в R16 , если массивы совпали :))
Но самый быстрый способ, конечно, это был бы (как это сделал один в этом топике ) - сорок сравнений в ряд, без всяких циклов. Ну что ж, как говорил мой дядюшка - "в ^^^^^^^^^^м доме и не такое делают"
Ну а топикстартер конечно же всех просто уделал, применив свой, наиболее "лаконичный" способ Вот, "учитесь"!
А asm его ни кто не глянул? Его asm с оптимизацией -Os соответствует asm VladislavS с -O3, один в один, и по быстродействию выходит так же 51мкс. Другая проблема - полученный в результате размер кода.
В теме про оптимизации и производительность кода, зачем-то объявлены глобальные переменные да еще и с external linkage (!). То есть явным образом подавлены оптимизационные возможности компилятора. В данном случае это, возможно, ни на что не повлияло, но тем не менее.
Добавляем `static` и
Код:
main: .L2: rjmp .L2
Совсем другое дело! Такой лаконичности никто пока продемонстрировать не смог
А если серьезно, то кто знает какие еще оптимизации были подавлены вашим использованием переменных с external linkage? Хотите тестировать оптимизационные возможности компилятора - не давайте ему полностью выкинуть всю функциональность (напр. `static volatile uint8_t result=0;`), но ни о каких переменных с external linkage речь быть не может. Как не может идти речи ни о каком программирования на С без массивного использования `const` и `restrict`.
Кстати, несмотря на то, что GCC - самый слабый компилятор из "большой тройки", меня сильно удивило то, что он в таком случае не не догадывается выполнить сравнение на стадии компиляции. Clang догадался.
Во-первых, тема отнюдь не про "оптимизацию производительности", вы невнимательно её читали.
Во-вторых, вы правда считаете, что все вокруг идиоты и не знают про возможности компилятора просчитать результат на этапе компиляции? Собственно, результат очевиден даже без компиляции "на глаз". А речь идёт именно о сравнении массивов в рантайме.
В-третьих, применительно к AVR gcc уж точно не самый слабый. Да и "большой тройки" как таковой для AVR не существует. IAR на этой задаче, кстати, слил по полной. Результат даже приводить не буду.
Сейчас этот форум просматривают: Shuspano и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения