文章目录

  • 1.选择合适的算法
  • 2.选择合适的数据结构
  • 3.选择合适的数据类型
  • 4.减少冗余拷贝或赋值次数
  • 5.减少运算的强度
  • 6.减少循环内耗时操作
  • 7.其它

1.选择合适的算法

应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。


举例:
将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。

2.选择合适的数据结构

选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。


1)数组与指针:
数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。

3.选择合适的数据类型

1)选择尽量小的数据类型
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。否则会造成内存浪费,而且运算时效率要低一些。
当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。


2)使用无符号整数,而不是整数
有些处理器可以处理无符号的整数,比有符号整数的运算速度要快。(这也是很好的实践,帮助self-documenting代码)


3)局部变量与全局变量
全局变量优点:使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。当然,使用全局变量会对程序有一些负作用。

4.减少冗余拷贝或赋值次数

1)参数减少值传递,多用指针/引用传递方式
函数执行时会将参数存放在栈中,这个过程中参数传递会耗时。如果传递的参数是int类型,可能对性能影响还不是很大。但如果传递的参数是一个较大的结构体,其效率问题就不言而喻了。相对应的,指针作为参数传递只把结构体地址存放在栈中,在数据结构较大时,效率优化很明显。
例如:
bool Compare (string s1, string s2)
bool Compare (string *s1, string *s2)
指针的形式,更能提高程序运行效率。


2)减少冗余拷贝
数据拷贝会将数据从一块内存拷贝到另一块内存。如果改成用指针,将数据的内存地址进行传递,同样能获取到数据,效率指针要快很多。
当然,必要的拷贝操作还是不能少的。


3)减少产生临时变量的情况
目前遇到的一些产生临时变量的情况:函数传参、函数返回值、隐式类型转换、多余的拷贝、赋值等。
一句话:少赋值/拷贝,多传递指针。

5.减少运算的强度

1)善用自加、自减
使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码。在使用到加一和减一操作时尽量使用增量和减量操作符,因为增量符语句比赋值语句更快,原因在于对大多数CPU来说,对内存字的增、减量操作不必明显地使用取内存和写内存的指令,比如下面这条语句:
x=x+1;
模仿大多数微机汇编语言为例,产生的代码类似于:
move A,x ; //把x从内存取出存入累加A
add A,1 ; //累加器A加1
store x ; //把新值存回x
如果使用增量操作符,生成的代码下:
incr x ; //x加1
显然,不用取指令和存指令,增、减量操作执行的速度加快,同时长度也缩短了。


2)使用运算量小但功能相同的表达式替换原来复杂的的表达式
善用位运算,如下:
a=a%8;
可以改为:
a=a&7;
位操作只需一个指令周期即可完成(更贴近于代码语言),而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。
善用移位实现乘除法运算,如下:
a=a4;
b=b/4;
可以改为:
a=a<<2;
b=b>>2;
通常如果需要乘以或除以2n,都可以用移位的方法代替。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:
a=a
9
可以改为:
a=(a<<3)+a

6.减少循环内耗时操作

1)减少循环内定义
将没有必要执行多次的操作全部把它们放到循环外面,这里包括表达式、函数的调用、指针运算、数组访问等。循环内的重复定义/计算,会造成内存浪费,而且运算时效率要低一些。 如:
for(int i = 0; i < strlen(s); ++i)
{
ClassTest CT = a;
//do something
}


思考:
++i与i++哪个运行效率更高?
do…while与while哪个运行效率跟高?

7.其它

1)减少跳转和切换等操作
Inline关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这样做在两个方面快于函数调用。这样做在两个方面快于函数调用:
第一,省去了调用指令需要的执行时间;
第二,省去了传递变元和传递过程需要的时间。

但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。


2)查表
在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启了,减少了程序执行过程中重复计算的工作量。


收录于:
嵌入式软件/BSP开发工程师/Linux驱动工程师/C语言经典笔试面试题大全

C:提高C代码运行效率的方法有哪些?列举几个提高代码执行效率的方法相关推荐

  1. java js 执行效率_JavaScript提高加载和执行效率的方法

    前言 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载 ...

  2. 【PHP面试题】请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句如何分析?

    文章目录 一.考点 1.查找分析查询速度慢的原因 1)分析SQL查询慢的方法 2)使用 show profile 3)使用 show status 4)使用 show processlist 5)使用 ...

  3. sql 中优化视图或sql语句的执行效率的方法

    参见引用http://www.alixixi.com/program/a/2010062662233.shtml 转载于:https://www.cnblogs.com/thornfield_he/a ...

  4. java 与c 运行效率_Java语言与C语言代码运行效率的比较

    <Java语言与C语言代码运行效率的比较>由会员分享,可在线阅读,更多相关<Java语言与C语言代码运行效率的比较(2页珍藏版)>请在人人文库网上搜索. 1.Java语言与C语 ...

  5. 提高SQL执行效率的16种方法

    项目中优化sql语句执行效率的方法: 1)尽量选择较小的列 2)将where中用的比较频繁的字段建立索引 3)select子句中避免使用'*' 4)避免在索引列上使用计算.not in 和<&g ...

  6. 提高python执行效率_提升Python程序运行效率的6个方法

    Python是一个很酷的语言,因为你可以在很短的时间内利用很少的代码做很多事情.不仅如此,它还能轻松地支持多任务,比如多进程等.Python批评者有时会说Python执行缓慢.本文将尝试介绍6个技巧, ...

  7. 提高C++程序运行效率的10个简单方法

    本文以C/C++程序为例讲述了程序运行效率的10个简单方法,分享给大家供大家参考之用.具体分析如下: 对于每一个程序员来说,程序的运行效率都是一个值得重视,并为之付出努力的问题.但是程序性能的优化也是 ...

  8. C语言提高代码效率的几种方法,7个提升嵌入式C代码效率的方法-嵌入式系统-与非网...

    C语言在嵌入式领域凭借着高效与简单的特点成为了一门与底层非常亲近的语言,当时由于嵌入式领域相比计算机领域硬件资源上是非常受限的,比如主频比较低.内存小等等. 这样就对嵌入式软件就有了新的要求,务必要写 ...

  9. 提高C++程序运行效率,减少运行时间的方法

    大致方法: 1.优化业务逻辑,尽量少做事情. 2.减少网络访问,IO等对外操作. 3.如果有数据库,优化SQL和数据库结构. 4.优化算法,比如冒泡排序改成快排等. 5.优化代码的编写.这个就很多了. ...

最新文章

  1. nature | 基于深度学习方法的虚拟组织染色
  2. windows 环境下python 安装 pypcap 并用pyinstaller打包到exe,解决DLL 加载失败。
  3. 未转变者服务器床id,最新id欢迎补充
  4. 在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)
  5. 2022年文化潮流趋势报告
  6. 专业制造计算机电缆,茶陵DJYP2VP2-22计算机电缆专业制造
  7. Qt编译Android库
  8. ABBYY FineReader15老牌ocr文字识别软件
  9. EI 和 SCI 检索号查询
  10. PS——制作 GIF动图 或是 小视频
  11. P4218 [CTSC2010]珠宝商
  12. 三阶魔方六面拼齐教程
  13. lisp实战文库_lisp编程实例
  14. WebService测试工具介绍及下载
  15. 邮件安全隐患有哪些?邮件安全如何保护?
  16. 计算机网络搭建比赛申请书,C世界计算机社团成立申请书
  17. 代谢组学分析常用网站
  18. 用 Trace32 分析内核死机
  19. 14-排序优化:如何实现一个通用的、高性能排序函数?
  20. 计算机硬盘的容量比光盘大得多,gis水平考题.doc

热门文章

  1. 【图分析】逼近(Approximation)
  2. 2021番禺铁一高考成绩查询,广州铁一中学2021年排名
  3. vue工程代码优化:新建utils文件夹统一管理工具函数
  4. python中的utils模块_python学习笔记-import utils报错
  5. Kewail平台的短信接口接入流程。
  6. 分享电音极速版助手APK和源代码
  7. Starting Tomcat V8.5 Server at localhost has encountered a problem.
  8. linux 检测网络丢包率,网络问题解决思路,Linux 知识点,测试丢包率,抓包及分析...
  9. 《帝国时代Ⅱ》图像资源查看器源代码
  10. Google之文件系统GFS