讲述几点对程序进行效率优化的方法

发布时间:2025-02-22 16:11

了解数据结构与算法优化程序效率 #生活知识# #生活经验# #编程#

讲述几点对程序进行效率优化的方法

最新推荐文章于 2022-12-29 17:25:14 发布

置顶 ctreewang 于 2011-08-27 17:21:35 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

   1.前言

        前几天看了深入理解计算机系统的 程序优化。因为前边两章节涉及到了太多的汇编,而本人不是计算机科班出身,计算机基础薄弱,看那些汇编代码的确很吃力, 打算以后对汇编慢慢来学习吧。毕竟学习不是一日之功。

        看到程序优化这章节,感触颇深啊,平常一些编程细节没有注意,其实都是影响到程序整体性能的因素,通过分析程序底层细节,如何调用等才知道如何影响到了程序。好了,下面根据书中讲解,我来做一些简要的总结。给自己学习到的东西做一下记录吧。

   2. 程序示例

        本节主要讲述我们的系统是如何将我们的代码转换成更有效的代码,其实我们所做的程序,系统都在为我们默默的做程序优化。上一段代码

typedef struct {

long int len;

data_t *data;

int allocated_len;

} vec_rec, *vec_ptr;


data_t是 这样定义的,因为本书可能会分析道不同的数据类型对程序的影响。 tydef int  data _t;可能考虑到使用合并的一些运算特别定义了:

#define INDNT 0

#define OP +

他对向量求和使用声明:

#define IDENT 1

#define OP *

#include <stdlib.h>

#include "combine.h"

vec_ptr new_vec(int len)

{

vec_ptr result = (vec_ptr) malloc(sizeof(vec_rec));

if (!result)

return NULL;

result->len = len;

result->allocated_len = len;

if (len > 0) {

data_t *data = (data_t *)calloc(len, sizeof(data_t));

if (!data) {

free((void *) result);

return NULL;

}

result->data = data;

}

else

result->data = NULL;

return result;

}

int get_vec_element(vec_ptr v, int index, data_t *dest)

{

if (index < 0 || index >= v->len)

return 0;

*dest = v->data[index];

return 1;

}

int vec_length(vec_ptr v)

{

return v->len;

}

data_t *get_vec_start(vec_ptr v)

{

return v->data;

}

int set_vec_element(vec_ptr v, int index, data_t val)

{

if (index < 0 || index >= v->len)

return 0;

v->data[index] = val;

return 1;

}

void set_vec_length(vec_ptr v, int newlen)

{

if (newlen > v->allocated_len) {

free(v->data);

v->data = calloc(newlen, sizeof(data_t));

v->allocated_len = newlen;

}

v->len = newlen;

}

在 合并函数1中

#include "combine.h"

char combine1_descr[] = "combine1: Maximum use of data abstraction";

void combine1(vec_ptr v, data_t *dest)

{

int i;

*dest = IDENT;

for (i = 0; i < vec_length(v); i++) {

data_t val;

get_vec_element(v, i, &val);

*dest = *dest OPER val;

}

}


未经优化的程序一般都是效率比较低的程序。在unix中,可以利用 ‘-O1’ 命令进行简单的优化。

    3.消除循环低效率

    上边的代码中,我们可以发现,在寻混内部 for (i = 0; i < vec_length(v); i ++) 中,我们每次循环都会调用vec_length(v)方法,其实求

vec_length(v)对程序是一个比较繁琐的的过程,当函数每次调用计算长度的时候就会产生效率低的问题,那么我们就要进行如下改进

  

void combine2(vec_ptr v, data_t *dest)

{

int i;

int length = vec_length(v);

*dest = IDENT;

for (i = 0; i < length; i++) {

data_t val;

get_vec_element(v, i, &val);

*dest = *dest OPER val;

}

}


这个时候,我们将代码移出了循环内部,我们只进行了一次 int length = vec_length(v); 求值。在书中有效率的比较已经达到了很大级别的提升了性能。

下面再来一个例子,

void lower1(char *s)

{

int i;

for (i = 0; i < strlen(s); i++)

if (s[i] >= 'A' && s[i] <= 'Z')

s[i] -= ('A' - 'a');

}

void lower2(char *s)

{

int i;

int len = strlen(s);

for (i = 0; i < len; i++)

if (s[i] >= 'A' && s[i] <= 'Z')

s[i] -= ('A' - 'a');

}

size_t strlen(const char *s)

{

int length = 0;

while (*s != '\0') {

s++;

length++;

}

return length;

}


在测试中,当对于个长度为1048576的字符串来说lower2函数只要1.5毫秒,比lower1快乐了500000 多倍。这是一个多么惊人的数字,所以我们要好好分析一下程序。

5.减少过程调用

        像我们看到那样,过程调用会带来相当大的开销,而且妨碍大多数的形式程序优化。,在combin2中,可以看出,每次混换忒带都会调用get_vec_elenment来获取下一个向量元素。对每个向量引用,这个函数把向量索引I与循环边界作比较,很明显会造成效率低下的。

        那么在combine函数中,我们增加一个函数get_vec_start。这个函数返回数组的起始地址。

  

data_t* get_vec_start(vect_pt v)

{

return v->data;

}

char combine3_descr[] = "combine3: Array reference to vector data";

void combine3(vec_ptr v, data_t *dest)

{

int i;

int length = vec_length(v);

data_t *data = get_vec_start(v);

*dest = IDENT;

for (i = 0; i < length; i++) {

*dest = *dest OPER data[i];

}

}


通过测试,提高效率比较小,那是怎么回事呢?请看下边一节。

6.消除不必要的存储器引用

        在这里主要通过汇编代码能看出,程序的不停存储拷贝要是影响到程序的效率。

       消除了无用存储器的读写。

char combine4_descr[] = "combine4: Array reference, accumulate in temporary";

void combine4(vec_ptr v, data_t *dest)

{

int i;

int length = vec_length(v);

data_t *data = get_vec_start(v);

data_t x = IDENT;

for (i = 0; i < length; i++) {

x = x OPER data[i];

}

*dest = x;

}


通过这个修改,可以看到程序又有了一大步的提升。以上的代码的重构让我对程序的细节调整感受颇深。

网址:讲述几点对程序进行效率优化的方法 https://www.yuejiaxmz.com/news/view/788597

相关内容

提高代码优化工作效率的几点方法
提高C++程序运行效率,减少运行时间的方法
9种流程优化方法,提升业务效率!
9种流程优化方法,提升业务效率
优化数学学习效率的方法
掌握优化流程的四种方法,提高流程运转效率
试述法对效率的促进作用。(南京大学2006年研)
流程优化方法有哪些,如何利用流程优化方法提高工作效率
一种在线教育课程优化排序方法及系统技术方案
优化工作效率的方法及途径.docx

随便看看