Я пытаюсь улучшить скорость моей текущей программы, программа регистрирует данные с нескольких датчиков, но одна часть в конкретном случае очень медленная.C Сохранение массива работающего сигнала отсортировано
В этой части я храню данные сигнала в целочисленном массиве размером 50 и извлекаю максимум и минимум, чтобы получить (сырую) индикацию амплитуды. Это делается для 3 датчиков каждую секунду, но сортировка массива для получения минимума и максимума занимает очень много времени.
Моя первая мысль заключалась в хранении данных в отсортированном списке, но как отслеживать, какая последняя точка сигнала должна быть удалена?
Текущий код:
static int movement[AD_SENSORS][AD_MOVEMENT_SIZE];
static int totals[AD_SENSORS];
int movement_sorted[AD_MOVEMENT_SIZE];
int difference = 0;
static unsigned int i; // Movement index
int k = 0;
//Update positions
if (++i>(AD_MOVEMENT_SIZE-1)){i=0;} //increment index of movement array
//Initialise signal value
struct tty_data_t *Current = NULL;
Current = head_tty;
//Add signals to movement array
while (Current != NULL){
totals[Current->ID] = totals[Current->ID] - movement[Current->ID][i];
movement[Current->ID][i] = Current->AD_signal;
totals[Current->ID] = totals[Current->ID] + movement[Current->ID][i];
Current->AD_average = totals[Current->ID]/AD_MOVEMENT_SIZE;
for (k = 0; k<AD_MOVEMENT_SIZE; k++){
movement_sorted[k] = movement[Current->ID][k];
}
qsort (movement_sorted, AD_MOVEMENT_SIZE, sizeof(int), Compare);
Current->AD_amplitude = movement_sorted[AD_MOVEMENT_SIZE-1] - movement_sorted[0];
difference += movement_sorted[AD_MOVEMENT_SIZE-1] - movement_sorted[0];
Current = Current->next;
}
g_movement = difference;
Зачем вам нужно, чтобы удалить последнюю точку сигнала? Почему вы не храните только максимальные и минимальные сигналы и не обновляете один из них каждый раз, если это необходимо? – GMichael
«действительно ли сортировка массива для получения минимума и максимума занимает очень много времени»? «целочисленный массив размером 50», «3 датчика в секунду»? На чем вы работаете, счеты? :) Плюс, что @Michael говорит - продолжайте работать max/min. –
Ну, на самом деле сейчас это не займет много времени, но есть план увеличить его до 8 датчиков со скоростью 100 раз в секунду на малине Pi и, глядя на callgrind, эта функция занимает 70% времени. * И как отслеживать max/min, если следующий datapoint добавлен в конец массива, а первый удаляется, как узнать, что такое max/min? – Enigma1991