现在的位置: 首页 > 综合 > 正文

那些隐藏在编码过程中的性能(一)

2013年09月21日 ⁄ 综合 ⁄ 共 855字 ⁄ 字号 评论关闭

引言:这篇文章主要对编码过程中的一些影响程序性能的编码习惯进行整理说明,文中的示例主要是C/C++的语言来举例,有些可能是伪代码,但总体上应该不会影响阅读。
可能因为篇幅和精力的问题,有些内容写的不是很细,又或者有错误,可以跟我交流。

1. 大循环放到内侧

对于多重循环来讲,将大的循环放到内侧,可以减少压栈出栈的次数,降低CPU开销;
如:
for(int i = 0; i < 5; i++)
{
for(int i = 0; i < 500; i++)
}

for(int i = 0; i < 500; i++)
{
for(int i = 0; i < 5; i++)
}
前者相当于外循环有5次的压栈出栈,后者的外循环却需要500次。

2. 合理的选择数据结构

数据结构与算法决定了程序的性能,这里想提到的指STL容器的选择,尤其是对于顺序存储结构和链式存储结构的选择;如vector和list的选择,在读操作较多的情况下,选择顺序结构,在写操作(插入/删除)较多的情况下选择链式存储结构;

3. 锁的粒度尽可能小

对于多线程编程而言,对于临界资源的保护会使用到锁机制,在使用锁的地方要保证锁粒度尽可能的小,只保护到需要保护的临界资源上,可以定义所对象,在一个{}的逻辑中终止生命周期。
对于临界资源的原子性操作,如int变量成为临界资源的情况下,可以不加锁(这个与CPU和编译器有关系,可以查看汇编指令确认是否为原子操作)。

4. 让函数快速的返回,高概率发生的逻辑放到函数靠前的位置

示例:
void func()
{
If (XXX)
{
/ / do sth
return;
}
If (YYY)
{
// do sth
return;
}
}
在写代码的过程中,可以考虑实际的业务场景,如果XXX发生的概率比较大,那么,将if XXX放到前面去,这样减少不必要的计算;

5. 延迟声明

对于未使用到的变量,尽可能在使用前再声明,以节省计算和栈空间。如:

void func()
{
int a;
for (int i; i<100; i++)
{
if XXX
return;
}
a++;
}

如上面的函数,有可能在for循环中已经返回,这个时候,声明的a变量就完全没有意义;

抱歉!评论已关闭.