📄 csdn_文档中心_快速初始化内存(1).htm
字号:
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></SPAN></SPAN></FONT> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">许多计算密集型的应用都需要处理大量内存,这种应用中的内存初始化是一个常规操作,而内存和</SPAN><SPAN
lang=EN-US>CPU</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部的数据交换之间的速度瓶颈决定了内存初始化将会占用可观的时间。但因为应用程序初始化内存往往调用</SPAN><SPAN
lang=EN-US>CRT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN
lang=EN-US>memset</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</SPAN><SPAN
lang=EN-US>Windows API</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN
lang=EN-US>ZeroMemory</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,很少有人在初始化方面进行优化。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><?xml:namespace prefix = o ns =
"urn:schemas-microsoft-com:office:office" /><o:p><FONT
size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另一方面,现在的应用硬件一般配置都比较好,大部分应用都运行在</SPAN><SPAN
lang=EN-US>PII</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之上,但我们在使用诸如</SPAN><SPAN
lang=EN-US>VC</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之类的编译环境时往往选择速度优化,并选择合适的处理器,然后寄希望于编译器给我们生成优化的结果,结果往往发现并不如意。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=3>在我们的一个图像处理项目中,需要大量内存操作,而且多个线程同时运行,内存存取成为了各个模块的竞争资源,所以对内存存取优化成为项目的关键。在努力减少内存操作遍数的基础上,加快内存初始化成为我们的改进重点。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在用</SPAN><SPAN
lang=EN-US>VC</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">各种手段都没有太多改进后,我们把目光转向处理器特征。从</SPAN><SPAN
lang=EN-US>Pentium</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列开始,一方面</SPAN><SPAN
lang=EN-US>Intel</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在不断提高</SPAN><SPAN
lang=EN-US>CPU</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主频,同时也在针对多媒体等应用相继推出</SPAN><SPAN
lang=EN-US>MMX/SSE/SSE2</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,增加了许多多位快速处理指令。在高层语言方面,</SPAN><SPAN
lang=EN-US>Intel</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN
lang=EN-US>C++ Compiler</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了针对不同处理器的最优化结果。但在一个成熟项目中贸然使用另外一种编译环境的风险较大,所以我们从</SPAN><SPAN
lang=EN-US>Intel</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中抽取了</SPAN><SPAN
lang=EN-US>memset</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现,重新组织了一个</SPAN><SPAN
lang=EN-US>Lib</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,并在我们的项目中针对内存初始化进行了改动,并链接到抽取的</SPAN><SPAN
lang=EN-US>lib</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库中。在内存初始化方面有了一个较大的提高。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=3>下面我们用测试例子说明该过程。</FONT></SPAN></P>
<H3 style="MARGIN: 13pt 0cm"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=5>一个例子</FONT></SPAN></H3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在测试程序中,分别调用微软</SPAN><SPAN
lang=EN-US>C</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库的</SPAN><SPAN
lang=EN-US>memset</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN
lang=EN-US>intel</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本的</SPAN><SPAN
lang=EN-US>memset</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分别对</SPAN><SPAN
lang=EN-US>100M</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存进行</SPAN><SPAN
lang=EN-US>60</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">遍初始化,,为了模拟多线程环境,启动了两个线程同时进行内存初始化。测试时使用了</SPAN><SPAN
lang=EN-US>Release</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版,为了方面查看包含了调试信息(调试信息无影响)。测试结果:</SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-SIZE: 14pt">MSC </SPAN><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本:</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 14pt">12.453~12.547</SPAN><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">秒</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 14pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-SIZE: 14pt">Intel C</SPAN><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本:</SPAN><SPAN
lang=EN-US style="COLOR: black; FONT-SIZE: 14pt">4.375</SPAN><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">~</SPAN><SPAN
lang=EN-US style="COLOR: black; FONT-SIZE: 14pt">4.531</SPAN><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">秒</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 14pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可见在大量内存操作时差别比较大。对内存存取密集型项目,因为内存存取往往是瓶颈,应该还可以提高整体处理性能。</SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面是例子的代码:</SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p> </o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: #009900; FONT-SIZE: 12pt; mso-font-kerning: 0pt">//
</SPAN><SPAN
style="COLOR: #009900; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">本程序示例了使用微软</SPAN><SPAN
lang=EN-US
style="COLOR: #009900; FONT-SIZE: 12pt; mso-font-kerning: 0pt">CRT</SPAN><SPAN
style="COLOR: #009900; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的</SPAN><SPAN
lang=EN-US
style="COLOR: #009900; FONT-SIZE: 12pt; mso-font-kerning: 0pt">memset</SPAN><SPAN
style="COLOR: #009900; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">和</SPAN><SPAN
lang=EN-US
style="COLOR: #009900; FONT-SIZE: 12pt; mso-font-kerning: 0pt">Intel</SPAN><SPAN
style="COLOR: #009900; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">优化的</SPAN><SPAN
lang=EN-US
style="COLOR: #009900; FONT-SIZE: 12pt; mso-font-kerning: 0pt">memset</SPAN><SPAN
style="COLOR: #009900; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">初始化内存的速度差异</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: #009900; FONT-SIZE: 12pt; mso-font-kerning: 0pt">//<SPAN
style="mso-spacerun: yes"> </SPAN>Lihw.</SPAN><SPAN lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p> </o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">#include
</SPAN><SPAN lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><</SPAN><SPAN
lang=EN-US
style="COLOR: #a000a0; FONT-SIZE: 12pt; mso-font-kerning: 0pt">stdio</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt">.h><o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">#include
</SPAN><SPAN lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><windows.h><o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">#include
</SPAN><SPAN lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><PROCESS.H><o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p> </o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">extern</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt">
</SPAN><SPAN lang=EN-US
style="COLOR: #000077; FONT-SIZE: 12pt; mso-font-kerning: 0pt">"C"</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P align=left class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><SPAN
lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">void</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"> *<SPAN
style="mso-spacerun: yes"> </SPAN></SPAN><SPAN lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">__cdecl</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt">
</SPAN><SPAN lang=EN-US
style="COLOR: #880000; FONT-SIZE: 12pt; mso-font-kerning: 0pt">__intel_new_memset</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt">(</SPAN><SPAN
lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">void</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt"> *,
</SPAN><SPAN lang=EN-US
style="COLOR: blue; FONT-SIZE: 12pt; mso-font-kerning: 0pt">int</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -