欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言数组移动的那些事

程序员文章站 2022-05-04 19:55:18
...

C语言数组移动的那些事

修改时间:2021.05.06 11:12

使用环境:Windows10 Clion C11 GCC

前情回顾

做嵌入式设计时涉及到数据动态绘图的功能,需要将所需数据放置在一个固定长度的数组中,就有了数组整体移动、抛弃旧数据、插入新数据的需求,由此有了两种解决方案,并做了一些简单的性能测试。

方案1

使用memcpy函数复制数组地址数据到对应地址,代码如下:

void floatArrayShift(float array[],float num){
    memcpy(array,&array[1],(MAX_WIDTH-1)*sizeof(float));
    array[MAX_WIDTH-1] = num;
}

int test1(){
    float data[MAX_WIDTH] = {(float)0.5};
    clock_t start,finish;
    start = clock();
    for(int i=0;i<MAX_WIDTH;i++){
        floatArrayShift(data,(float)(i+0.1));
    }
    finish = clock();
    printf("TEST1: %ld ms\n",finish-start);
    return 0;
}

需要注意的是,此方案相比于方案2,需要注意数组的类型,在面临多种类型的数组时,需要额外增加对类型所占内存的判断及计算。

方案2

使用for循环遍历数组向前幅值,代码如下:

int test2(){
    float data[MAX_WIDTH] = {(float)0.5};
    clock_t start,finish;
    start = clock();
    for(int i=0;i<MAX_WIDTH;i++){
        for (int j=0;j<MAX_WIDTH-1;j++){
            data[j] = data[j+1];
        }
        data[MAX_WIDTH-1] = (float)(i+0.1);
    }
    finish = clock();
    printf("TEST2: %ld ms\n",finish-start);
    return 0;
}

性能测试

设置MAX_WIDTH为10000,对两种方案进行性能测试,10次测试结果如下,单位ms

TEST1 10 9 20 9 11 10 9 19 9 9
TEST2 269 240 230 240 250 237 240 230 230 231

受个人编码能力影响,此次试验可能存在误差,但大致可以看出,使用内存操作比遍历的速度明显加快,可以明显提升软件运行效率。

完整测试代码

#include <stdio.h>
#include <string.h>
#include <time.h>

#define MAX_WIDTH 10000

void floatArrayShift(float array[],float num){
    memcpy(array,&array[1],(MAX_WIDTH-1)*sizeof(float));
    array[MAX_WIDTH-1] = num;
}

int test1(){
    float data[MAX_WIDTH] = {(float)0.5};
    clock_t start,finish;
    start = clock();
    for(int i=0;i<MAX_WIDTH;i++){
        floatArrayShift(data,(float)(i+0.1));
    }
    finish = clock();
    printf("TEST1: %ld ms\n",finish-start);
    return 0;
}

int test2(){
    float data[MAX_WIDTH] = {(float)0.5};
    clock_t start,finish;
    start = clock();
    for(int i=0;i<MAX_WIDTH;i++){
        for (int j=0;j<MAX_WIDTH-1;j++){
            data[j] = data[j+1];
        }
        data[MAX_WIDTH-1] = (float)(i+0.1);
    }
    finish = clock();
    printf("TEST2: %ld ms\n",finish-start);
    return 0;
}

int main() {
    test1();
    test2();
    return 0;
}
相关标签: c语言