博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

九月枫叶

人生有如枫叶在秋风里也能红的灿烂Unix is simple. It just takes a genius to understand its simplicity
  w3g8.cublog.cn

关于作者
姓名:*****
职业:计算机网络
年龄:25
位置:山西★运城
个性介绍:人生有如枫叶在秋风里也能红的灿烂。工具,而不是策略。
|| << >> ||
我的分类


C程序优化之路
  本文讲述在编写C程序代码的常用优化办法,分为I/O篇,内存篇,算法篇,MMX汇编篇。

一.I/O

       如果有文件读写的话,那么对文件的访问将是影响程序运行速度的一大因素。提高文件访问速度的主要办法有两个:一是采用内存映射文件,二是使用内存缓冲。下面是一组测试数据(见《UNIX环境高级编程》3.9节),显示了用18种不同的缓存长度,读1 468 802字节文件所得到的结果。

缓冲大小

用户CPU(秒)

系统CPU(秒)

时钟时间(秒)

循环次数(秒)

1

23.8

397.9

423.4

1 468 802

2

12.3

202.0

215.2

734 401

4

6.1

100.6

107.2

367 201

8

3.0

50.7

54.0

183 601

16

1.5

25.3

27.0

91 801

32

0.7

12.8

13.7

45 901

64

0.3

6.6

7.0

22 951

128

0.2

3.3

3.6

11 476

256

0.1

1.8

1.9

5 738

512

0.0

1.0

1.1

2 869

1 024

0.0

0.6

0.6

1 435

2 048

0.0

0.4

0.4

718

4 096

0.0

0.4

0.4

359

8 192

0.0

0.3

0.3

180

16 384

0.0

0.3

0.3

90

32 768

0.0

0.3

0.3

45

65 536

0.0

0.3

0.3

23

131 072

0.0

0.3

0.3

12

可见,一般的当内存缓冲区大小为8192的时候,性能就已经是最佳的了,这也就是为什么在H.263等图像编码程序中,缓冲区大小为8192的原因(有的时候也取2048大小)。使用内存缓冲区方法的好处主要是便于移植,占用内存少,便于硬件实现等。下面是读取文件的C伪码:

    int Len;

BYTE buffer[8192];

    ASSERT(buffer==NULL);

    If buffer is empty{

        Len=read(File,buffer,8192);

        If(len==0) No data and exit;

    }

       

但是如果内存比较大的时候,采用内存映射文件可以达到更佳性能,并且编程实现简单。内存映射的具体使用说明见msdn October 2001中的Platform SDK

Documentation—Base Services—File Storage—File Mapping。下面是一点建议:

内存映射文件不能超过虚拟内存的大小,最好也不要太大,如果内存映射文件接近虚拟内存大小的时候,反而会大大降低程序的速度(其实是因为虚拟内存不足导致系统运行效率降低),这个时候,可以考虑分块映射,但是我觉得如果这样,还不如直接使用内存缓冲来得直接一些。

可以将两种方法统一使用,如我在编大图像文件数据处理的时候(因为是Unix工作站,内存很大GB单位)使用了内存映射文件,但是为了最佳性能,也使用了一行图像缓存,这样在读取文件中数据的时候,就保证了仅仅是顺序读写(内存映射文件中,对顺序读写有专门的优化)。

在写文件的时候使用内存映射文件要有一点小技巧:应该先创建足够大的文件,然后将这个文件映射,在处理完这个文件的时候,用函数SetFilePointer和SetEndOfFile来对文件进行截尾。

对内存映射文件进行操作与对内存进行操作类似(使用起来就象数组一样),那么如果有大块数据读写的时候,切记使用memcpy()函数(或者CopyMemory()函数)

 

    总之,如果要使用内存映射文件,必须:1.处理的文件比较的小,2.处理的文件很大,但是运行环境内存也很大,并且一般在运行该程序的时候不运行其他消耗内存大的程序,同时用户对速度有特别的要求,而且对内存占用没有什么要求。如果以上两个条件不满足的时候,建议使用内存缓冲区的办法。

·C程序优化之路(二)
·C程序优化之路(三)
·MMX开发文档

发表于: 2006-10-20,修改于: 2006-10-20 12:47,已浏览2753次,有评论1条 推荐 投诉


网友评论
网友: time1984 时间:2007-07-26 17:32:26 IP地址:218.82.214.★
总之,如果要使用内存映射文件,必须:1.处理的文件比较的小,2.处理的文件很大,但是运行环境内存也很大,并且一般在运行该程序的时候不运行其他消耗内存大的程序,同时用户对速度有特别的要求,而且对内存占用没有什么要求。如果以上两个条件不满足的时候,建议使用内存缓冲区的办法
 关键词:虚拟主机 空间租用 免费空间 ASP空间 PHP空间 NET空间  ASP虚拟主机 
PHP虚拟主机 NET虚拟 BLOG虚拟主机 全能虚拟主机 全能空间 数据库 程序虚拟主机 

全国第一家虚拟主机:支持伪静态.有利于提高排名

15G全能空间年付500元/月付50元 可免费试用
5GB 独立WEB空间、5GB 企业邮箱空间、5GB MYSQL数据库 
IIS连接数据 500 个、500GB/月流量、共享日志文件空间 

企业邮箱功能 
赠送5GB 超大企业邮箱,500个Email企业邮箱用户 
自动回复、自动转发、POP3、SMTP收发信、SMTP发信认证 
邮件过滤、邮件拒收、邮件夹管理、邮件域管理、定制邮件数 

数据库功能 
支持5GB MSSQL数据库空间,5个用户数据库、Access 

主机功能支持 
采用安全稳定的Win2003 .net2.0 架构 
支持ASP、PHP、ASP.NET、PERL等脚本、支持自定义CGI 
全面支持.net2.0版本,独立的Application应用池,
支持SSI(Shtml),支持FrontPage扩展 
可免费自行绑定5个域名、500个解析、500个子域名 


详情咨询021-51695858   QQ:1209636   消息来自time( 福网)

官方网站: www.abcnic.com 

 发表评论