⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c

📁 C程序优化 I/O
💻
字号:
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TD {
	FONT-SIZE: 9pt; LINE-HEIGHT: 16px
}
A {
	COLOR: #003399; TEXT-DECORATION: none
}
A:hover {
	COLOR: #ff6600; TEXT-DECORATION: underline
}
.newtx {
	BORDER-RIGHT: 1px groove; BORDER-TOP: 1px groove; FONT-SIZE: 9pt; BORDER-LEFT: 1px groove; WIDTH: 120px; BORDER-BOTTOM: 1px groove; HEIGHT: 19px
}
.newbt {
	BORDER-RIGHT: 1px ridge; BORDER-TOP: 1px ridge; FONT-SIZE: 9pt; BORDER-LEFT: 1px ridge; WIDTH: 50px; BORDER-BOTTOM: 1px ridge; BACKGROUND-COLOR: #a2afc6
}
.a1 {
	COLOR: #000000; TEXT-DECORATION: none
}
.a2 {
	LINE-HEIGHT: 18px
}
.f1 {
	FONT-SIZE: 12px; LINE-HEIGHT: 20px
}
.f2 {
	FONT-SIZE: 12pt; LINE-HEIGHT: 22px
}
</STYLE>
<title>C程序优化 - I/O</title>
</head>

<BODY BACKGROUND="..\back\bg.gif" leftmargin="0" topmargin="0" marginheight="0" marginwidth="0">
<h1 align="center"><FONT COLOR="#FF0000"><B><SPAN STYLE='font-size:18.0pt;mso-bidi-font-size:12.0pt'><FONT CLASS=title 
                        COLOR=#ff0000><B><BR>C程序优化 - I/O篇</B></FONT></SPAN></B></FONT></h1><P ALIGN="CENTER"><B>liyuming1978(原作)</B></P><TABLE WIDTH="94%" ALIGN="CENTER"><TR><TD class=f2><P>  如果有文件读写的话,那么对文件的访问将是影响程序运行速度的一大因素。提高文件访问速度的主要办法有两个:一是采用内存映射文件,二是使用内存缓冲。下面是一组测试数据(见《UNIX环境高级编程》3.9节),显示了用18种不同的缓存长度,读1,468 
,802字节文件所得到的结果。</P><TABLE WIDTH="90%" ALIGN="CENTER" BORDERCOLOR="#330000"><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">缓冲大小</DIV></TD><TD><DIV ALIGN="CENTER">用户CPU(秒)</DIV></TD><TD><DIV ALIGN="CENTER">系统CPU(秒)</DIV></TD><TD><DIV ALIGN="CENTER">时钟时间(秒)</DIV></TD><TD><DIV ALIGN="CENTER">循环次数(秒)</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">1</DIV></TD><TD><DIV ALIGN="CENTER">23.8</DIV></TD><TD><DIV ALIGN="CENTER">397.9</DIV></TD><TD><DIV ALIGN="CENTER">423.4</DIV></TD><TD><DIV ALIGN="CENTER">1 
468 802</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">2</DIV></TD><TD><DIV ALIGN="CENTER">12.3</DIV></TD><TD><DIV ALIGN="CENTER">202.0</DIV></TD><TD><DIV ALIGN="CENTER">215.2</DIV></TD><TD><DIV ALIGN="CENTER">734 
401</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">4</DIV></TD><TD><DIV ALIGN="CENTER">6.1</DIV></TD><TD><DIV ALIGN="CENTER">100.6</DIV></TD><TD><DIV ALIGN="CENTER">107.2</DIV></TD><TD><DIV ALIGN="CENTER">367 
201</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">8</DIV></TD><TD><DIV ALIGN="CENTER">3.0</DIV></TD><TD><DIV ALIGN="CENTER">50.7</DIV></TD><TD><DIV ALIGN="CENTER">54.0</DIV></TD><TD><DIV ALIGN="CENTER">183 
601</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">16</DIV></TD><TD><DIV ALIGN="CENTER">1.5</DIV></TD><TD><DIV ALIGN="CENTER">25.3</DIV></TD><TD><DIV ALIGN="CENTER">27.0</DIV></TD><TD><DIV ALIGN="CENTER">91 
801</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">32</DIV></TD><TD><DIV ALIGN="CENTER">0.7</DIV></TD><TD><DIV ALIGN="CENTER">12.8</DIV></TD><TD><DIV ALIGN="CENTER">13.7</DIV></TD><TD><DIV ALIGN="CENTER">45 
901</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">64</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">6.6</DIV></TD><TD><DIV ALIGN="CENTER">7.0</DIV></TD><TD><DIV ALIGN="CENTER">22 
951</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">128</DIV></TD><TD><DIV ALIGN="CENTER">0.2</DIV></TD><TD><DIV ALIGN="CENTER">3.3</DIV></TD><TD><DIV ALIGN="CENTER">3.6</DIV></TD><TD><DIV ALIGN="CENTER">11 
476</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">256</DIV></TD><TD><DIV ALIGN="CENTER">0.1</DIV></TD><TD><DIV ALIGN="CENTER">1.8</DIV></TD><TD><DIV ALIGN="CENTER">1.9</DIV></TD><TD><DIV ALIGN="CENTER">5 
738</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">512<BR> </DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">1.0</DIV></TD><TD><DIV ALIGN="CENTER">1.1</DIV></TD><TD><DIV ALIGN="CENTER">2 
869</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">1 024</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.6</DIV></TD><TD><DIV ALIGN="CENTER">0.6</DIV></TD><TD><DIV ALIGN="CENTER">1 
435</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">2 048</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.4</DIV></TD><TD><DIV ALIGN="CENTER">0.4</DIV></TD><TD><DIV ALIGN="CENTER">718</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">4 
096</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.4</DIV></TD><TD><DIV ALIGN="CENTER">0.4</DIV></TD><TD><DIV ALIGN="CENTER">359</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER"><FONT COLOR="#FF0000">8 
192</FONT></DIV></TD><TD><DIV ALIGN="CENTER"><FONT COLOR="#FF0000">0.0</FONT></DIV></TD><TD><DIV ALIGN="CENTER"><FONT COLOR="#FF0000">0.3</FONT></DIV></TD><TD><DIV ALIGN="CENTER"><FONT COLOR="#FF0000">0.3</FONT></DIV></TD><TD><DIV ALIGN="CENTER"><FONT COLOR="#FF0000">180</FONT></DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">16 
384</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">90</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">32 
768</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">45</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">65 
536</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">23</DIV></TD></TR><TR><TD WIDTH="20%"><DIV ALIGN="CENTER">131 
072</DIV></TD><TD><DIV ALIGN="CENTER">0.0</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">0.3</DIV></TD><TD><DIV ALIGN="CENTER">12</DIV></TD></TR></TABLE><P>  可见,一般的当内存缓冲区大小为8192的时候,性能就已经是最佳的了,这也就是为什么在H.263等图像编码程序中,缓冲区大小为8192的原因(有的时候也取2048大小)。使用内存缓冲区方法的好处主要是便于移植,占用内存少,便于硬件实现等。下面是读取文件的C伪码:</P><P> 
int Len ;<BR>BYTE buffer[8192] ;<BR>ASSERT(buffer==NULL) ;<BR>If buffer is empty<BR>{<BR>  Len=read(File,buffer,8192) 
;<BR>  If(len==0) No data and exit ;<BR>}</P><P> </P><P>  但是如果内存比较大的时候,采用内存映射文件可以达到更佳性能,并且编程实现简单。内存映射的具体使用说明见msdn 
October 2001中的Platform SDK:Documentation—Base Services—File Storage—File Mapping。</P><P>下面是一点建议:<BR>① 
内存映射文件不能超过虚拟内存的大小,最好也不要太大,如果内存映射文件接近虚拟内存大小的时候,反而会大大降低程序的速度(其实是因为虚拟内存不足导致系统运行效率降低),这个时候,可以考虑分块映射,但是我觉得如果这样,还不如直接使用内存缓冲来得直接一些。</P><P>② 
可以将两种方法统一使用,如我在编大图像文件数据处理的时候(因为是Unix工作站,内存很大GB单位)使用了内存映射文件,但是为了最佳性能,也使用了一行图像缓存,这样在读取文件中数据的时候,就保证了仅仅是顺序读写(内存映射文件中,对顺序读写有专门的优化)。</P><P>③ 
在写文件的时候使用内存映射文件要有一点小技巧:应该先创建足够大的文件,然后将这个文件映射,在处理完这个文件的时候,用函数SetFilePointer和SetEndOfFile来对文件进行截尾。</P><P>④ 
对内存映射文件进行操作与对内存进行操作类似(使用起来就象数组一样),那么如果有大块数据读写的时候,切记使用memcpy()函数(或者CopyMemory()函数)</P><P> 
</P><P>   总之,如果要使用内存映射文件,必须:1.处理的文件比较的小,2.处理的文件很大,但是运行环境内存也很大,并且一般在运行该程序的时候不运行其他消耗内存大的程序,同时用户对速度有特别的要求,而且对内存占用没有什么要求。如果以上两个条件不满足的时候,建议使用内存缓冲区的办法。</P><P></P></TD></TR></TABLE><br> 
</body>

</html>
<html></html>
<html></html>
<html></html>
<html></html>
<html><script language="JavaScript">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -