Единственный вариант хоть немного выиграть - убрать проверку for
(i=0;i<len;i++) на КАЖДОМ шаге сравнения. 1) Используйте техники разворачивания циклов, например Устройство Даффа. Пример:
#include stdint.h
#include stdio.h
#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))
uint8_t find_max (uint8_t *arr, uint8_t len)
{
uint8_t max = 0;
uint8_t n = (len + 7) / 8;
switch (len % 8)
{
case 0: do { if (*arr > max) {max = *arr;}; arr++;
case 7: if (*arr > max) {max = *arr;}; arr++;
case 6: if (*arr > max) {max = *arr;}; arr++;
case 5: if (*arr > max) {max = *arr;}; arr++;
case 4: if (*arr > max) {max = *arr;}; arr++;
case 3: if (*arr > max) {max = *arr;}; arr++;
case 2: if (*arr > max) {max = *arr;}; arr++;
case 1: if (*arr > max) {max = *arr;}; arr++;
} while (--n > 0);
}
return max;
}
int main()
{
uint8_t arr[] = {0,1,2,3,99,6,7};
uint8_t max = find_max(arr, NELEMS(arr));
printf("max %d\n", max);
return 0;
}
Здесь проверка на выход за пределы массива проходит не перед каждым сравнением, каждые 8 раз.
2) gcc умеет сам разворачивать циклы, но я такого не пробовал. Попробуйте ключи -O3 -funroll-all-loops -funroll-loops