在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码。不要优化程序中开销不大的那80%,这是劳而无功的。

第一招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:

方法A:通常的办法

#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is a example!!");

方法B:

const char string2[LEN] ="This is a example!";
char * cp;
cp = string2 ;

使用的时候可以直接用指针来操作。

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。

第二招: 使用而不是函数。

这也是第一招的变招。函数和宏的区别就在于,宏占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的来保存数据的,如果编译器里有栈检查选 项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一 些CPU时间。 而宏不存在这个问题。宏仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏的时候,该现象尤其突出。

举例如下:

方法C:

#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
 return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);
}
void SET_BITS(int __dst,
int __bf, int __val)
{
 __dst = ((__dst) & ~(BIT_MASK(__bf))) |
\
 (((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS,ReGISterNumber);

方法D:

#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf)
(((1U << (bw ## __bf)) - 1)
<< (bs ## __bf))
#define SET_BITS(__dst, __bf, __val)
\
((__dst) = ((__dst) & ~(BIT_MASK(__bf)))
| \
(((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS,
RegisterNumber);

D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会

转载于:https://blog.51cto.com/yanjishierhao/558418

优化C代码常用的几招相关推荐

  1. 优化C语言代码常用的几招

    在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码.不要优化程序中开销不大的那80%,这是劳而无功的. 第一招:以空间换时间 ...

  2. 基于ceres的后端优化的代码实现

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨从零开始搭SLAM 作者丨李太白lx 由于g2o天然是进行位姿图优化的, 所以十分契合karto ...

  3. FCKeditor 2.4.3精简优化带代码高亮(Dphighlighter)插件版

    FCKeditor 2.4.3精简优化带代码高亮(Dphighlighter)插件版 转自:http://www.sablog.net/blog/archives/288/ 不要问我有没有上传功能,或 ...

  4. IntelliJ IDEA代码常用的快捷键(自查)

    IntelliJ IDEA代码常用的快捷键有: Alt+回车 导入包,自动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt+O ...

  5. 用 Neon Intrinsics 优化 C 代码

    以下内容翻译自:Optimizing C Code with Neon Intrinsics 概述 本指南向您展示如何在 C 或 C++ 代码中使用 Neon intrinsics 函数,以利用 Ar ...

  6. 数据库连接池---------------也优化了代码

    数据库连接池---------------也优化了代码 一.编写数据库连接池 ·实现javax.sql.DataSource接口,有getConnection()和getConnection(Stri ...

  7. asp java 变量_ASP_用stack变量优化Java代码,  java程序包含了大量的对象 - phpStudy...

    用stack变量优化Java代码 java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量. 我们写一个Java类,在其 ...

  8. c语言运行时显示内存不足,请问:c或c++运行时 遇到虚拟内存不足时咋办,帮优化下代码...

    请问:c或c++运行时 遇到虚拟内存不足时咋办,帮优化下代码 [size=4][size=5]我编的一个高精度解hilbert方程组的程序段,用的是GS跌代,但运行时出现"虚拟内存不足&qu ...

  9. 优化JavaScript代码

    我google一下,已有人翻译了此文.感觉比我翻译的要好!是译言站翻译的 见www.yeeyan.com/articles/view/92135/47626/dz 原文见:http://code.go ...

最新文章

  1. The Shortest Statement CodeForces - 1051F LCA+最短路
  2. 【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)
  3. 《因果科学周刊》第4期:因果赋能推荐系统
  4. 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现
  5. 在本地安装git的HTML帮助文档
  6. myeclipse连接hadoop集群编程及问题解决
  7. pae扩展内存 linux,浅析linux内核内存管理之PAE
  8. LeetCode之无重复字符的最长子串
  9. laravel修改.env不生效原因以及解决办法
  10. 解决SQL查询总是 超时已过期
  11. redhat怎样修改语言_硕士博士个人陈述(PS)辅导及修改服务带你极速前进!
  12. c常用算法程序集_10万赞的AI算法集:含python,java,C,C++多种语言
  13. 去年微软颁发1360万美元奖励,中国提交的漏洞报告数量位列前三强
  14. 经典算法题每日演练——第二十题 三元组
  15. VC++学习(5):文本编程
  16. 轴系ansys命令流建模
  17. WPF 点击按钮打开新窗口
  18. 算法面试和实习经验分享
  19. Go使用绘图的库(go-charts、go-echarts)
  20. 时空序列预测之PredRNN++(Casual LSTM和GHU解决时空预测学习中的深度困境)

热门文章

  1. aptana手动配置python环境_Aptana Studio 3中通过Auto Config配置PyDev中Python出错
  2. Linux下的vim文本替换,Linux下文本的vim文本替换
  3. python中的logging日志
  4. LeetCode-笔记-131. 分割回文串
  5. Elasticsearch之分布式介绍
  6. Selenium如何通过location和size定位元素坐标?
  7. python提交spark_带有python入口点的sparksubmit
  8. 计算机视觉中本质矩阵的概念,【计算机视觉】Lecture 19:本质矩阵和基础矩阵...
  9. 字节增强java_java字节增加 - longjunping的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 更新pcb封装导入_PCB中3D应用相关功能详解