ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 апреля
1072501 Топик полностью
arhiv6 (27.01.2021 09:21, просмотров: 540) ответил Tpoeшник на Си. AVR. Ищу самый быстрый во вселенной алгоритм поиска максимального числа в огромном массиве char.
Единственный вариант хоть немного выиграть - убрать проверку 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