优化C代码常用的几招
在性能优化方面永远注意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代码常用的几招相关推荐
- 优化C语言代码常用的几招
在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码.不要优化程序中开销不大的那80%,这是劳而无功的. 第一招:以空间换时间 ...
- 基于ceres的后端优化的代码实现
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨从零开始搭SLAM 作者丨李太白lx 由于g2o天然是进行位姿图优化的, 所以十分契合karto ...
- FCKeditor 2.4.3精简优化带代码高亮(Dphighlighter)插件版
FCKeditor 2.4.3精简优化带代码高亮(Dphighlighter)插件版 转自:http://www.sablog.net/blog/archives/288/ 不要问我有没有上传功能,或 ...
- IntelliJ IDEA代码常用的快捷键(自查)
IntelliJ IDEA代码常用的快捷键有: Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O ...
- 用 Neon Intrinsics 优化 C 代码
以下内容翻译自:Optimizing C Code with Neon Intrinsics 概述 本指南向您展示如何在 C 或 C++ 代码中使用 Neon intrinsics 函数,以利用 Ar ...
- 数据库连接池---------------也优化了代码
数据库连接池---------------也优化了代码 一.编写数据库连接池 ·实现javax.sql.DataSource接口,有getConnection()和getConnection(Stri ...
- asp java 变量_ASP_用stack变量优化Java代码, java程序包含了大量的对象 - phpStudy...
用stack变量优化Java代码 java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量. 我们写一个Java类,在其 ...
- c语言运行时显示内存不足,请问:c或c++运行时 遇到虚拟内存不足时咋办,帮优化下代码...
请问:c或c++运行时 遇到虚拟内存不足时咋办,帮优化下代码 [size=4][size=5]我编的一个高精度解hilbert方程组的程序段,用的是GS跌代,但运行时出现"虚拟内存不足&qu ...
- 优化JavaScript代码
我google一下,已有人翻译了此文.感觉比我翻译的要好!是译言站翻译的 见www.yeeyan.com/articles/view/92135/47626/dz 原文见:http://code.go ...
最新文章
- The Shortest Statement CodeForces - 1051F LCA+最短路
- 【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)
- 《因果科学周刊》第4期:因果赋能推荐系统
- 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现
- 在本地安装git的HTML帮助文档
- myeclipse连接hadoop集群编程及问题解决
- pae扩展内存 linux,浅析linux内核内存管理之PAE
- LeetCode之无重复字符的最长子串
- laravel修改.env不生效原因以及解决办法
- 解决SQL查询总是 超时已过期
- redhat怎样修改语言_硕士博士个人陈述(PS)辅导及修改服务带你极速前进!
- c常用算法程序集_10万赞的AI算法集:含python,java,C,C++多种语言
- 去年微软颁发1360万美元奖励,中国提交的漏洞报告数量位列前三强
- 经典算法题每日演练——第二十题 三元组
- VC++学习(5):文本编程
- 轴系ansys命令流建模
- WPF 点击按钮打开新窗口
- 算法面试和实习经验分享
- Go使用绘图的库(go-charts、go-echarts)
- 时空序列预测之PredRNN++(Casual LSTM和GHU解决时空预测学习中的深度困境)
热门文章
- aptana手动配置python环境_Aptana Studio 3中通过Auto Config配置PyDev中Python出错
- Linux下的vim文本替换,Linux下文本的vim文本替换
- python中的logging日志
- LeetCode-笔记-131. 分割回文串
- Elasticsearch之分布式介绍
- Selenium如何通过location和size定位元素坐标?
- python提交spark_带有python入口点的sparksubmit
- 计算机视觉中本质矩阵的概念,【计算机视觉】Lecture 19:本质矩阵和基础矩阵...
- 字节增强java_java字节增加 - longjunping的个人空间 - OSCHINA - 中文开源技术交流社区...
- 更新pcb封装导入_PCB中3D应用相关功能详解