我正在努力提高我当前程序的速度,该程序记录来自多个传感器的数据,但其中一部分非常慢。
在这一部分中,我将信号数据存储在大小为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;
最佳答案
对50个元素进行排序不需要很长时间,它肯定能够在不到三分之一秒的时间内完成。
不过,你可能不需要真正排序假设您有一个最后50个元素的滚动数组,那么您只需要在有限的情况下调整min
和max
(以及与之匹配的元素的计数,mincount
和maxcount
)我只给你一个最大值的步骤,但是很容易复制最小的逻辑。这些都是互斥的情况,应该按照给定的顺序进行检查(找到的第一个匹配项排除了后面的所有匹配项):
将元素添加到空列表时,将max
设置为该元素并将maxcount
设置为一个。
如果添加的值与删除的值相同,则不要执行任何操作。
如果要添加与max
相同的值,只需向maxcount
添加一个。
如果要添加的值大于当前值,请将max
设置为该值并将max
设置为一。
如果要删除的值与maxcount
相同且max
大于1,则只需减小maxcount
。
否则,如果要删除的值等于当前的maxcount
(此时,max
必须是一个),请扫描列表中的项以重新计算新的maxcount
,并相应地设置计数。
唯一可能代价高昂的选择是最后一个,我希望它很少发生在任何情况下,搜索一个50大小的数组,每次迭代进行两次比较,仍然应该是盲目的快速。
别太在意表现了即使是8个传感器,每秒钟100个读数,也只能提供800个数据点对于这么小的数据集,排序可能是个愚蠢的任务,因为按顺序扫描许多项仍然会非常快(特别是如果您不必每次更新滚动数据时都这样做的话)。