如何把C语言for循环用循环展开技术优化?

如何把C语言for循环用循环展开技术优化?,第1张

循环展开可以减少循环的次数,对程序的性能带了两方面的提高。一是减少了对循环没有森悄直接贡献的计算,比如循环计数变量的计算,分支跳转指令的执行等。二是提供了进一步利用机器特性进行的优化的机会。

通过循环展开,每次迭代将累加4个元素,减少了此枯渣循环次数,从而减少了总的执行时间(单独使用这种优化方法,对浮点数累败段乘几乎没有提高,但是整数累乘得益于编译器的重关联代码变化会有大幅度提高)。

这种优化可以直接利用编译器完成,将优化level设定到较高,编译器会自动进行循环展开。使用gcc,可以显式使用-funroll-loops选项。

1. 看你的算法效率,其实这个是核心

2. 语意优化。

自己审查代码,哪些可以合并的,比如说命名一个循环即可解决,你非要写了两个循环分别来进行,这情况可以合并;

3. 减少new / delete 对

考虑采用内存池,自己编写管理模块。这举孝个看具体应用拦衫

4. windows接口的使用记得采用微软推荐的方式

5. 牺牲空间换取时间

用内存空间换取速度优势,这个你搜索下,有很多例子

------------------------------

还是建议你先审查自己的程序。。。确定瓶颈在哪了,再正衡稿谈优化!不然,会很盲目!

优化0:题目要求输入学生个数上限,所以乎旦雹输入n那里需要验证。

优化1:减少循环次数,题目没有说找最大最小必须单独循环。那么直接在输入循环的时候就能得结果。

优化2:你的j每次只循环一次,没有必要。

优化3:输入那里用临时变量传递,没必要,直接用数组地址。

优化4:数组最大值定义常量,便于后期程序修改参数。

下面代码,我完全按照你的写法写的,你拿来参考。(要是学过指针,比大小那里试试换成指针更好)

#include <stdio.h>

#define MS 40//最大学生人数

int main()

{

  int n=0,i

  int a[MS][2]

  int minmark,maxmark,minxuehao,maxxuehao

  while(!n || n>MS)

      printf("请输入学生数量:"),scanf("%d",&n)

  for(i=0i<ni++)

  {

      printf("请输入学生学号:")

      scanf("%d",&a[i][0])

      printf("请输入学生成绩:")

 迟滚    岁帆 scanf("%d",&a[i][1])

      if(i==0)

          minmark=maxmark=a[0][1]

      else{

          if(minmark>a[i][1]) minmark=a[i][1],minxuehao=a[i][0]

          if(maxmark<a[i][1]) maxmark=a[i][1],maxxuehao=a[i][0]

      }

  }

  printf("最高分为%d,学号为%d\n",maxmark,maxxuehao)

  printf("最高分为%d,学号为%d\n",minmark,minxuehao)

  return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8237539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存