C语言代码效率提高-----循环优化

C语言代码效率提高-----循环优化


文章目录

  • C语言代码效率提高-----循环优化
  • 1.已经知道结果后,马上停止判断
  • 2 循环的合并
  • 3循环的展开


1.已经知道结果后,马上停止判断

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <sys/time.h>

bool example1(int data[],int n){
    bool ret = false;
    for(int i = 0;i < n; i++){
        if(data[i] < 0){
            ret = true;
        }
    }
}
//使用break
bool example2(int data[],int n){
    bool ret = false;
    for(int i = 0;i < n; i++){
        if(data[i] < 0){
            ret = true;
            break;
        }
    }
}

//添加判断
bool example3(int data[],int n){
    bool ret = false;
    for(int i = 0;i < n && !ret; i++){
        if(data[i] < 0){
            ret = true;
        }
    }
}

int main() {
    int data[1000000]={0};
    memset(data,0,sizeof(data));
    data[9999] = -1;
    struct timeval tv;
    struct timeval tv1;
    struct timeval tv2;
    struct timeval tv3;
    struct timeval tv4;
    struct timeval tv5;
    
    gettimeofday(&tv, NULL);
    long long milliseconds = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
    
    if(example1(data,sizeof(data)/sizeof(data[0]))){
        printf("有负数\n");
    }else{
        printf("没有负数\n");
    }
    
    
    gettimeofday(&tv1, NULL);
    long long milliseconds1 = (tv1.tv_sec * 1000LL) + (tv1.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("example1时间差:%lld 毫秒\n",milliseconds1-milliseconds);
    
    gettimeofday(&tv2, NULL);
    milliseconds = (tv2.tv_sec * 1000LL) + (tv2.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
    if(example2(data,sizeof(data)/sizeof(data[0]))){
        printf("有负数\n");
    }else{
        printf("没有负数\n");
    }
    
    gettimeofday(&tv3, NULL);
    milliseconds1 = (tv3.tv_sec * 1000LL) + (tv3.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("example2时间差:%lld 毫秒\n",milliseconds1-milliseconds);
    
    gettimeofday(&tv4, NULL);
    milliseconds = (tv4.tv_sec * 1000LL) + (tv4.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
    if(example3(data,sizeof(data)/sizeof(data[0]))){
        printf("有负数\n");
    }else{
        printf("没有负数\n");
    }
    
    gettimeofday(&tv5, NULL);
    milliseconds1 = (tv5.tv_sec * 1000LL) + (tv5.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("example13时间差:%lld 毫秒\n",milliseconds1-milliseconds);
    
     return 0;
}

data[] = -1;
data大小取不同

C语言代码效率提高-----循环优化_第1张图片

2 循环的合并

合并前

#include <stdio.h>
#include <sys/time.h>

int main() {
    int a[1000000];
    int b[1000000];
    struct timeval tv;
    struct timeval tv1;
    gettimeofday(&tv, NULL);
    long long milliseconds = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
       for(int i = 0;i < 1000000; i++){
            a[i] = i + 1;
    }
    for(int i = 0;i < 1000000; i++){
            b[i] = i + i;
    }

    gettimeofday(&tv1, NULL);
    long long milliseconds1 = (tv1.tv_sec * 1000LL) + (tv1.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("时间差:%lld 毫秒\n",milliseconds1-milliseconds);
     return 0;


}

合并后

#include <stdio.h>
#include <sys/time.h>

int main() {
    int a[1000000];
    int b[1000000];
    struct timeval tv;
    struct timeval tv1;
    gettimeofday(&tv, NULL);
    long long milliseconds = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
       for(int i = 0;i < 1000000; i++){
            a[i] = i + 1;
            b[i] = i + i;
    }

    gettimeofday(&tv1, NULL);
    long long milliseconds1 = (tv1.tv_sec * 1000LL) + (tv1.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("时间差:%lld 毫秒\n",milliseconds1-milliseconds);
     return 0;
  }

C语言代码效率提高-----循环优化_第2张图片

3循环的展开

#include <stdio.h>
#include <sys/time.h>

int main() {
    char a[1000000];
    int n = 100000;
    struct timeval tv;
    struct timeval tv1;
    gettimeofday(&tv, NULL);
    long long milliseconds = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
       for(int i = 0;i < 100; i++){
        for(int i = 0;i < n; i++){
                a[i] = i +1;
            }
    }
    gettimeofday(&tv1, NULL);
    long long milliseconds1 = (tv1.tv_sec * 1000LL) + (tv1.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("时间差:%lld 毫秒\n",milliseconds1-milliseconds);
     return 0;
}

优化后

#include <stdio.h>
#include <sys/time.h>

int main() {
    char a[1000000];
    int n = 100000;
    struct timeval tv;
    struct timeval tv1;
    gettimeofday(&tv, NULL);
    long long milliseconds = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds);
       for(int k = 0;k < 100; k++){
        int i;
        for( i = 0;i < n - 1; i += 2){
                a[i] = i +1;
                a[i +1 ] = i + 2;
            }
        if(i == n -1){
            a[i] = i + 1;
        }    
    }
    gettimeofday(&tv1, NULL);
    long long milliseconds1 = (tv1.tv_sec * 1000LL) + (tv1.tv_usec / 1000LL);
    printf("当前时间:%lld 毫秒\n", milliseconds1);
    printf("时间差:%lld 毫秒\n",milliseconds1-milliseconds);
     return 0;
}

C语言代码效率提高-----循环优化_第3张图片

优化前41毫秒,优化后27毫秒,速度明显提升。
但是这种用法,不符合一般的代码规范,所以需要根据具体情况来权衡。

你可能感兴趣的:(c/c++,嵌入式Linux开发,c语言,linux,驱动开发,arm开发,嵌入式)