Да нет, просто использует более выгодный по скорости порядок и состав инструкций.
Поскольку я - зануда, то как вцеплюсь - не отстаю. А кто мне мешает этот же "более выгодный по скорости порядок и состав инструкций" расписать на асме во вставке? Я вот голословно утверждаю, что умный компилятор может разработать код, который по быстродействию не хуже сделанного на асме (умным программистом), но чтобы лучше - для этого нет никаких предпосылок.
А кто мне мешает этот же "более выгодный по скорости порядок и состав инструкций" расписать на асме во вставке?
Никто не мешает, но в данном случае вы этого не сделали. Результат компилятора с -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 на этой задаче, кстати, слил по полной. Результат даже приводить не буду.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения