0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中如何优化代码的执行效率

麦辣鸡腿堡 来源:轩哥谈芯 作者:Debug 2023-11-20 18:09 次阅读

while 和 do ...while

用while循环时有以下两种循环形式:

unsigned int i;
i=0;
while (i< 1000)
{
   i++;
   //用户程序
}

或:

unsigned int i;
i=1000;
do
{
   i--;
   //用户程序
}
while (i >0);

在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环,而且do...while循环大多数时候更可靠,具备更好的容错性。

适当的对循环做展开

这是经典的速度优化,但许多编译程序(如gcc -funroll-loops)能自动完成这个事,所以现在你自己来优化这个显得效果不明显。

旧代码:

for (i = 0; i < 100; i++)
{
  do_stuff(i);
}

新代码:

for (i = 0; i < 10; )
{
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
}

可以看出,新代码里比较指令由100次降低为10次,循环时间节约了90%。不过注意: 对于中间变量或结果被更改的循环,编译程序往往拒绝展开,这时候就需要你自己来做展开工作了。

还有一点需要注意,在有内部指令cache的CPU上(如MMX芯片),因为循环展开的代码很大,往往会导致cache溢出,这时展开的代码会频繁地在CPU 的cache和内存之间调来调去,又因为cache速度很高,所以此时循环展开反而会变慢。还有就是循环展开会影响矢量运算优化。

相同循环条件的嵌套起来

把相关循环放到一个循环里,也会加快速度。

旧代码:

for (i = 0; i < MAX; i++)         /* initialize 2d array to 0's */
    for (j = 0; j < MAX; j++)
        a[i][j] = 0.0;
    for (i = 0; i < MAX; i++)        /* put 1's along the diagonal */
        a[i][i] = 1.0;

新代码:

for (i = 0; i < MAX; i++)         /* initialize 2d array to 0's */
{
    for (j = 0; j < MAX; j++)
        a[i][j] = 0.0;
    a[i][i] = 1.0;                            /* put 1's along the diagonal */
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10870

    浏览量

    211896
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136929
  • 代码
    +关注

    关注

    30

    文章

    4790

    浏览量

    68653
收藏 人收藏

    评论

    相关推荐

    C语言中宏定义的应用

    C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 845次阅读

    C语言中for循环的用法和应用 C语言中for循环与while循环的区别

    C语言中的循环结构时,for循环是最常用的一种。它允许重复执行一段代码,直到满足特定条件为止。
    发表于 08-18 16:33 3270次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>for循环的用法和应用 <b class='flag-5'>C</b><b class='flag-5'>语言中</b>for循环与while循环的区别

    编程语言中一个奇怪的代码结构

    C语言C++等编程语言中,我们常常会遇到一个奇怪的代码结构。
    发表于 11-01 10:24 445次阅读
    编程<b class='flag-5'>语言中</b>一个奇怪的<b class='flag-5'>代码</b>结构

    C语言优化小技巧

    在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考:1.
    发表于 04-24 14:13

    C语言优化小技巧

    `在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考:1.
    发表于 04-11 15:08

    C语言优化小技巧

    在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考:1.
    发表于 09-23 14:10

    C语言优化小技巧

    C语言优化小技巧在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行
    发表于 10-13 14:34

    请问C语言中ASCII代码是什么意思?

    C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
    发表于 04-28 07:35

    C语言中断言如何去使用

    文章目录1 C语言中断言的使用1.1 处理方式1.2 原型定义1.3 示例代码1 C语言中断言的使用1.1 处理方式如果断言的条件返回错误,
    发表于 07-14 08:15

    C语言中的宏是什么

    第五章 性能优化5.1 使用宏定义  在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。  写一个"标准"宏MIN ,这个宏
    发表于 12-15 08:20

    C语言中ASCII代码是什么意思?

    C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
    发表于 10-25 07:10

    C语言中随机数的生成代码

    C语言中随机数的生成完整代码
    的头像 发表于 02-20 09:21 1w次阅读

    C语言高效编程与代码优化

    翻译作者:码农网 gunner 在本篇文章中,我收集了很多经验和方法。应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码
    的头像 发表于 10-19 17:04 1682次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>高效编程与<b class='flag-5'>代码</b><b class='flag-5'>优化</b>

    在标准C语言中编译出来的可执行程序

    在标准C语言中,编译出来的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。如下代码
    的头像 发表于 06-16 09:01 1906次阅读
    在标准<b class='flag-5'>C</b><b class='flag-5'>语言中</b>编译出来的可<b class='flag-5'>执行</b>程序

    c语言中顺序结构的基本流程

    的语句组成,这些语句用于完成特定的任务或操作。在C语言中,每个语句都以分号结束,多个语句可以用大括号括起来形成一个语句块。在顺序结构中,每个语句都依次执行,按照代码的顺序
    的头像 发表于 11-22 10:20 1033次阅读