﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-MindScape</title><link>http://www.cnblogs.com/jonnyyu/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 04:33:18 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 04:33:18 GMT</pubDate><ttl>60</ttl><item><title>[GCC学习]get the optimized function call graph</title><link>http://www.cnblogs.com/jonnyyu/archive/2009/05/20/1473549.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Wed, 20 May 2009 15:59:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2009/05/20/1473549.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/1473549.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2009/05/20/1473549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/1473549.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/1473549.html</trackback:ping><description><![CDATA[<p>当GCC以优化方式编译代码的时候,它会执行Dead Code Elimiation(DCE), 就是把那些源代码中定义但是却从未调用到的函数从中间目标文件中去掉.(.o文件)</p>
<p>例如下面这段代码:</p>
<p>#include &lt;stdio.h></p>
<p>static void test() {</p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>printf ("this code is never called.");<br />
</p>
<p>}</p>
<p>int main() {</p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>printf("this is main function.");</p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>return 0;</p>
<p>}</p>
<p>这里我们定义了一个static函数和一个main函数.按照C语言的约定,static 函数是只在当前模块可见, 非static函数则可被其它模块所包含.&#160;</p>
<p>然后我们通过检查使用和不使用DCE时,GCC的汇编输出来观察DCE的作用.</p>
<p>不使用DCE:</p>
<p>gcc -S -fno-builtin -fdump-ipa-cgraph test.c &#160;-o test.S</p>
<p>这里生成汇编结果说明了DCE的过程是在编译阶段已经完成, 命令中</p>
<p>-fdump-ipa-cgraph, 这是个调试输出选项,会生成一个.cgraph文件,我们后面会进一步查看这个文件.</p>
<p>查看test.S可以发现_test这个函数的定义出现在汇编代码中,&#160;</p>
<p>
</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_234519" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_234519').style.display='none'; document.getElementById('Code_Open_Image_234519').style.display='inline'; document.getElementById('Code_Open_Text_234519').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="display: none; "><img id="Code_Open_Image_234519" style="display: inline; " onclick="this.style.display='none'; document.getElementById('Code_Open_Text_234519').style.display='none'; getElementById('Code_Closed_Image_234519').style.display='inline'; getElementById('Code_Closed_Text_234519').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_234519" class="cnblogs_code_Collapse" style="display: none; ">test.S</span><span id="Code_Open_Text_234519" style="display: inline; "><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&#160;1</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.cstring<br />
</span><span style="color: #008080;">&#160;2</span>&#160;<span style="color: #008080;">LC0:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;3</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.ascii&#160;</span><span style="color: #800000;">"</span><span style="color: #800000;">Hello&#160;World\12\0</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;4</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.text<br />
</span><span style="color: #008080;">&#160;5</span>&#160;<span style="color: #008080;">_test:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;6</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;pushl&#160;&#160;&#160;%ebp<br />
</span><span style="color: #008080;">&#160;7</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;%esp,&#160;%ebp<br />
</span><span style="color: #008080;">&#160;8</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;subl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">24</span><span style="color: #000000;">,&#160;%esp<br />
</span><span style="color: #008080;">&#160;9</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">call</span><span style="color: #000000;">&#160;&#160;&#160;&#160;L3<br />
</span><span style="color: #008080;">10</span>&#160;<span style="color: #800000;">"</span><span style="color: #800000;">L00000000001$pb</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">11</span>&#160;<span style="color: #008080;">L3:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;popl&#160;&#160;&#160;&#160;%ecx<br />
</span><span style="color: #008080;">13</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;leal&#160;&#160;&#160;&#160;LC0-</span><span style="color: #800000;">"</span><span style="color: #800000;">L00000000001$pb</span><span style="color: #800000;">"</span><span style="color: #000000;">(%ecx),&#160;%eax<br />
</span><span style="color: #008080;">14</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;%eax,&#160;-</span><span style="color: #800080;">16</span><span style="color: #000000;">(%ebp)<br />
</span><span style="color: #008080;">15</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">leave</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">ret</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&#160;<span style="color: #000000;">.globl&#160;_main<br />
</span><span style="color: #008080;">18</span>&#160;<span style="color: #008080;">_main:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">19</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;pushl&#160;&#160;&#160;%ebp<br />
</span><span style="color: #008080;">20</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;%esp,&#160;%ebp<br />
</span><span style="color: #008080;">21</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;pushl&#160;&#160;&#160;%ebx<br />
</span><span style="color: #008080;">22</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;subl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">20</span><span style="color: #000000;">,&#160;%esp<br />
</span><span style="color: #008080;">23</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">call</span><span style="color: #000000;">&#160;&#160;&#160;&#160;L6<br />
</span><span style="color: #008080;">24</span>&#160;<span style="color: #800000;">"</span><span style="color: #800000;">L00000000002$pb</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">25</span>&#160;<span style="color: #008080;">L6:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;popl&#160;&#160;&#160;&#160;%ebx<br />
</span><span style="color: #008080;">27</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;leal&#160;&#160;&#160;&#160;LC0-</span><span style="color: #800000;">"</span><span style="color: #800000;">L00000000002$pb</span><span style="color: #800000;">"</span><span style="color: #000000;">(%ebx),&#160;%eax<br />
</span><span style="color: #008080;">28</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;%eax,&#160;(%esp)<br />
</span><span style="color: #008080;">29</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">call</span><span style="color: #000000;">&#160;&#160;&#160;&#160;L_printf$stub<br />
</span><span style="color: #008080;">30</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">0</span><span style="color: #000000;">,&#160;%eax<br />
</span><span style="color: #008080;">31</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;addl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">20</span><span style="color: #000000;">,&#160;%esp<br />
</span><span style="color: #008080;">32</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;popl&#160;&#160;&#160;&#160;%ebx<br />
</span><span style="color: #008080;">33</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">leave</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">ret</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.section&#160;__IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,</span><span style="color: #800080;">5</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">36</span>&#160;<span style="color: #008080;">L_printf$stub:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">37</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.indirect_symbol&#160;_printf<br />
</span><span style="color: #008080;">38</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">hlt</span><span style="color: #000000;">&#160;</span><span style="color: #008000;">;</span><span style="color: #008000;">&#160;hlt&#160;;&#160;hlt&#160;;&#160;hlt&#160;;&#160;hlt</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">39</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.subsections_via_symbols<br />
</span><span style="color: #008080;">40</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">41</span>&#160;</span></div>
<p>&#160;</p>
<p>如果编译生成.o文件的话,使用nm工具可以看到中间目标文件中的符号定义中也存在test这个函数.</p>
<p>
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">nm&#160;</span><span style="color: #0000FF;">test</span><span style="color: #000000;">.o<br />
<br />
</span><span style="color: #800080;">00000017</span><span style="color: #000000;">&#160;T&#160;_main<br />
&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160;U&#160;_printf<br />
</span><span style="color: #800080;">00000000</span><span style="color: #000000;">&#160;t&#160;_test</span></div>
<p>&#160;</p>
<p>
</p>
<p>接下来打开DCE开关看看:</p>
<p>gcc -O -S -fno-builtin -fdump-ipa-cgraph test.c -o test.S</p>
<p>
</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_235000" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_235000').style.display='none'; document.getElementById('Code_Open_Image_235000').style.display='inline'; document.getElementById('Code_Open_Text_235000').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="display: inline; "><img id="Code_Open_Image_235000" style="display: none; " onclick="this.style.display='none'; document.getElementById('Code_Open_Text_235000').style.display='none'; getElementById('Code_Closed_Image_235000').style.display='inline'; getElementById('Code_Closed_Text_235000').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_235000" class="cnblogs_code_Collapse" style="display: inline; ">test.S</span><span id="Code_Open_Text_235000" style="display: none; "><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&#160;1</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.cstring<br />
</span><span style="color: #008080;">&#160;2</span>&#160;<span style="color: #008080;">LC0:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;3</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.ascii&#160;</span><span style="color: #800000;">"</span><span style="color: #800000;">Hello&#160;World\12\0</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;4</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.text<br />
</span><span style="color: #008080;">&#160;5</span>&#160;<span style="color: #000000;">.globl&#160;_main<br />
</span><span style="color: #008080;">&#160;6</span>&#160;<span style="color: #008080;">_main:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;7</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;pushl&#160;&#160;&#160;%ebp<br />
</span><span style="color: #008080;">&#160;8</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;%esp,&#160;%ebp<br />
</span><span style="color: #008080;">&#160;9</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;pushl&#160;&#160;&#160;%ebx<br />
</span><span style="color: #008080;">10</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;subl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">20</span><span style="color: #000000;">,&#160;%esp<br />
</span><span style="color: #008080;">11</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">call</span><span style="color: #000000;">&#160;&#160;&#160;&#160;L3<br />
</span><span style="color: #008080;">12</span>&#160;<span style="color: #800000;">"</span><span style="color: #800000;">L00000000001$pb</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">13</span>&#160;<span style="color: #008080;">L3:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;popl&#160;&#160;&#160;&#160;%ebx<br />
</span><span style="color: #008080;">15</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;leal&#160;&#160;&#160;&#160;LC0-</span><span style="color: #800000;">"</span><span style="color: #800000;">L00000000001$pb</span><span style="color: #800000;">"</span><span style="color: #000000;">(%ebx),&#160;%eax<br />
</span><span style="color: #008080;">16</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;%eax,&#160;(%esp)<br />
</span><span style="color: #008080;">17</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">call</span><span style="color: #000000;">&#160;&#160;&#160;&#160;L_printf$stub<br />
</span><span style="color: #008080;">18</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;movl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">0</span><span style="color: #000000;">,&#160;%eax<br />
</span><span style="color: #008080;">19</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;addl&#160;&#160;&#160;&#160;$</span><span style="color: #800080;">20</span><span style="color: #000000;">,&#160;%esp<br />
</span><span style="color: #008080;">20</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;popl&#160;&#160;&#160;&#160;%ebx<br />
</span><span style="color: #008080;">21</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">leave</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">ret</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">23</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.section&#160;__IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,</span><span style="color: #800080;">5</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">24</span>&#160;<span style="color: #008080;">L_printf$stub:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">25</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.indirect_symbol&#160;_printf<br />
</span><span style="color: #008080;">26</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF;">hlt</span><span style="color: #000000;">&#160;</span><span style="color: #008000;">;</span><span style="color: #008000;">&#160;hlt&#160;;&#160;hlt&#160;;&#160;hlt&#160;;&#160;hlt</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">27</span>&#160;<span style="color: #000000;">&#160;&#160;&#160;&#160;.subsections_via_symbols<br />
</span><span style="color: #008080;">28</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&#160;</span></div>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;可以看到,test函数已经不在了.nm中也不见了_test符号.</p>
<p>
</p>
<p>
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #800080;">00000000</span><span style="color: #000000;">&#160;T&#160;_main<br />
&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160;U&#160;_printf</span></div>
<p>&#160;</p>
<p>随汇编过程,GCC还会生成一个.cgraph的文件,这里面记录了gcc移除函数过程.</p>
<p>
</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_235451" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_235451').style.display='none'; document.getElementById('Code_Open_Image_235451').style.display='inline'; document.getElementById('Code_Open_Text_235451').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="display: none; "><img id="Code_Open_Image_235451" style="display: inline; " onclick="this.style.display='none'; document.getElementById('Code_Open_Text_235451').style.display='none'; getElementById('Code_Closed_Image_235451').style.display='inline'; getElementById('Code_Closed_Text_235451').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_235451" class="cnblogs_code_Collapse" style="display: none; ">cgraph</span><span id="Code_Open_Text_235451" style="display: inline; "><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&#160;1</span>&#160;<span style="color: #000000;">Initial&#160;entry&#160;</span><span style="color: #008080;">points:</span><span style="color: #000000;">&#160;main<br />
</span><span style="color: #008080;">&#160;2</span>&#160;<span style="color: #000000;">Unit&#160;entry&#160;</span><span style="color: #008080;">points:</span><span style="color: #000000;">&#160;main<br />
</span><span style="color: #008080;">&#160;3</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;4</span>&#160;<span style="color: #000000;">Initial&#160;</span><span style="color: #008080;">callgraph:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;5</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;6</span>&#160;<span style="color: #000000;">main/</span><span style="color: #800080;">4</span><span style="color: #000000;">:&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns&#160;needed&#160;tree&#160;inlinable<br />
</span><span style="color: #008080;">&#160;7</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;8</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;">&#160;printf/</span><span style="color: #800080;">3</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&#160;9</span>&#160;<span style="color: #000000;">printf/</span><span style="color: #800080;">3</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">10</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;">&#160;main/</span><span style="color: #800080;">4</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&#160;<span style="color: #0000FF;">test</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">:&#160;tree<br />
</span><span style="color: #008080;">13</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&#160;<span style="color: #000000;">__sputc/</span><span style="color: #800080;">1</span><span style="color: #000000;">:&#160;tree<br />
</span><span style="color: #008080;">16</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&#160;<span style="color: #000000;">__swbuf/</span><span style="color: #800080;">0</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">19</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">21</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&#160;<span style="color: #000000;">Reclaiming&#160;</span><span style="color: #008080;">functions:</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">test</span><span style="color: #000000;">&#160;__sputc<br />
</span><span style="color: #008080;">23</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">24</span>&#160;<span style="color: #000000;">Reclaimed&#160;</span><span style="color: #008080;">callgraph:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">25</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&#160;<span style="color: #000000;">main/</span><span style="color: #800080;">4</span><span style="color: #000000;">:&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns&#160;needed&#160;tree&#160;inlinable<br />
</span><span style="color: #008080;">27</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">28</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;">&#160;printf/</span><span style="color: #800080;">3</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&#160;<span style="color: #000000;">printf/</span><span style="color: #800080;">3</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">30</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;">&#160;main/</span><span style="color: #800080;">4</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">31</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span>&#160;<span style="color: #000000;">__swbuf/</span><span style="color: #800080;">0</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">33</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">36</span>&#160;<span style="color: #000000;">Marking&#160;local&#160;</span><span style="color: #008080;">functions:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">37</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">38</span>&#160;<span style="color: #000000;">Marked&#160;</span><span style="color: #008080;">callgraph:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">39</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">40</span>&#160;<span style="color: #000000;">main/</span><span style="color: #800080;">4</span><span style="color: #000000;">:&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns&#160;needed&#160;tree&#160;inlinable<br />
</span><span style="color: #008080;">41</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">42</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;">&#160;printf/</span><span style="color: #800080;">3</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">43</span>&#160;<span style="color: #000000;">printf/</span><span style="color: #800080;">3</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">44</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;">&#160;main/</span><span style="color: #800080;">4</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">45</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">46</span>&#160;<span style="color: #000000;">__swbuf/</span><span style="color: #800080;">0</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">47</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">48</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">49</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">50</span>&#160;<span style="color: #000000;">Deciding&#160;on&#160;inlining.&#160;&#160;Starting&#160;with&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns.<br />
</span><span style="color: #008080;">51</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">52</span>&#160;<span style="color: #000000;">Inlining&#160;always_inline&#160;</span><span style="color: #008080;">functions:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">53</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">54</span>&#160;<span style="color: #000000;">Deciding&#160;on&#160;smaller&#160;</span><span style="color: #008080;">functions:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">55</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">56</span>&#160;<span style="color: #000000;">Deciding&#160;on&#160;functions&#160;called&#160;</span><span style="color: #008080;">once:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">57</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">58</span>&#160;<span style="color: #000000;">Reclaiming&#160;</span><span style="color: #008080;">functions:</span><span style="color: #000000;">&#160;__swbuf<br />
</span><span style="color: #008080;">59</span>&#160;<span style="color: #000000;">Reclaimed&#160;</span><span style="color: #800080;">0</span><span style="color: #000000;">&#160;insns<br />
</span><span style="color: #008080;">60</span>&#160;<span style="color: #000000;">Inlined&#160;</span><span style="color: #800080;">0</span><span style="color: #000000;">&#160;calls,&#160;eliminated&#160;</span><span style="color: #800080;">0</span><span style="color: #000000;">&#160;functions,&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns&#160;turned&#160;to&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns.<br />
</span><span style="color: #008080;">61</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">62</span>&#160;<span style="color: #000000;">Optimized&#160;</span><span style="color: #008080;">callgraph:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">63</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">64</span>&#160;<span style="color: #000000;">main/</span><span style="color: #800080;">4</span><span style="color: #000000;">:&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns&#160;needed&#160;tree&#160;inlinable<br />
</span><span style="color: #008080;">65</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">66</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;">&#160;printf/</span><span style="color: #800080;">3</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">67</span>&#160;<span style="color: #000000;">printf/</span><span style="color: #800080;">3</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">68</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;">&#160;main/</span><span style="color: #800080;">4</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">69</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">70</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">71</span>&#160;<span style="color: #000000;">Final&#160;</span><span style="color: #008080;">callgraph:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">72</span>&#160;<span style="color: #000000;"><br />
</span><span style="color: #008080;">73</span>&#160;<span style="color: #000000;">main/</span><span style="color: #800080;">4</span><span style="color: #000000;">:&#160;</span><span style="color: #800080;">16</span><span style="color: #000000;">&#160;insns&#160;needed&#160;inlinable&#160;asm_written<br />
</span><span style="color: #008080;">74</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">75</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">76</span>&#160;<span style="color: #000000;">printf/</span><span style="color: #800080;">3</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">77</span>&#160;<span style="color: #000000;">&#160;&#160;called&#160;</span><span style="color: #008080;">by:</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">78</span>&#160;<span style="color: #000000;">&#160;&#160;</span><span style="color: #008080;">calls:</span><span style="color: #000000;">&#160;
</span></span></div>
<p>&#160;</p>
<p>&#160;</p><img src ="http://www.cnblogs.com/jonnyyu/aggbug/1473549.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>界面开发中的那些疯狂的小事</title><link>http://www.cnblogs.com/jonnyyu/archive/2008/04/20/1161844.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Sat, 19 Apr 2008 18:11:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2008/04/20/1161844.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/1161844.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2008/04/20/1161844.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/1161844.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/1161844.html</trackback:ping><description><![CDATA[讲讲我的一些教训吧。<br />
我所参与的应用开发是一款桌面应用程序，为了良好的用户体验，产品设计使用了许多自定义窗口和自绘控件，在最早的需求说明书中，软件的界面的需求只是一些PhotoShop做的截图。大伙儿很快就按照截图做出了界面。但是立刻就被QA组拒收了，因为截图中和我们的开发环境用的都是XP Luna Silver的theme, 而QA组用的是XP Luna blue theme以及Windows 2k, 这样用户界面上有些系统控件的颜色随着theme改变了而有些自绘控件却仍然是银灰色，非常不协调。产品设计，开发都忽略了theme这个细节因素对整体界面风格的影响，大家只好重新讨论实现theme的支持。<br />
<br />
另一个，有一个自定义窗口需求里面要求在屏幕左半边的时候边框的滚动条靠左，反之在屏幕右半边的时候滚动条靠右。某位哥们实现的时候直接就按WorkingArea的一半来判断，WorkingAreas是个好东西它还能正确处理Taskbar在侧边的情形。当然这个代码在绝大多数的机器上的确表现良好，包括QA组的测试。结果最后一个Beta客户发现了问题，这个窗口在他的副显示器上工作不正常。天，还有多显示器这回事。。。第二天开发组和QA组就加了几台显示器。<br />
<br />
<br />
<br />
<img src ="http://www.cnblogs.com/jonnyyu/aggbug/1161844.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47986/" target="_blank">网易澄清:与暴雪合资公司仅提供技术支持</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Re：架构设计之性能设计经验 </title><link>http://www.cnblogs.com/jonnyyu/archive/2007/12/16/997072.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Sun, 16 Dec 2007 15:10:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2007/12/16/997072.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/997072.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2007/12/16/997072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/997072.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/997072.html</trackback:ping><description><![CDATA[<p><font face="Courier New">博主主要谈的是如何优化系统性能</font></p>
<p><font face="Courier New">其实我觉得这些技术本身都是很好的，但是一般来说出现性能问题并不是因为缺乏优化的意识和技术，而更多的是由于没有发现的性能瓶颈或者忽视了这个瓶颈的重要性。 <br />
<br />
</font><font face="Courier New">对于开发一个长期使用的应用，在其生命周期中会功能会不断的添加和修改，实际运行环境的变化也会导致不同的性能瓶颈产生，因此加入应用服务质量指标的检测的目标是很有必要的。<br />
</font><font face="Courier New"><br />
我觉得架构层次上的性能设计应该首先考虑应用性能的刻度量性,定义明确的性能目标这样可以指导性能优化设计采取适当的优化设计。并且在压力测试中通过性能验证模块验证优化设计是否有效。<br />
</font></p>
<img src ="http://www.cnblogs.com/jonnyyu/aggbug/997072.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>技术资产管理</title><link>http://www.cnblogs.com/jonnyyu/archive/2007/12/16/997065.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Sun, 16 Dec 2007 15:05:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2007/12/16/997065.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/997065.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2007/12/16/997065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/997065.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/997065.html</trackback:ping><description><![CDATA[<p>如果把技术比作金融资产，那么你会发现经典投资法则依然是那么正确：</p> <p>1.定期投资：把学习新技术作为一种的习惯，无论投资量多小。</p> <p>2.多元化投资：学习不同方面的技术，接触面越广机会也会越多。</p> <p>3.风险管理：不要把所有的技术鸡蛋都放在一个篮子里。</p> <p>4.低买高卖：锻炼自己的感觉预测新兴技术的流行趋势，当然这很困难而且没有指标可循。</p> <p>5.周期性的重新评估和平衡资产：不断评估你所在投入研究的技术，分析你需要投资的新技术，放弃研究一些过时的技术。</p> <p>&nbsp;</p> <p>-- 摘自《程序员修炼之道》</p><img src ="http://www.cnblogs.com/jonnyyu/aggbug/997065.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>.Net下进程外COM服务器的实现</title><link>http://www.cnblogs.com/jonnyyu/archive/2007/07/05/807726.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Thu, 05 Jul 2007 14:41:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2007/07/05/807726.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/807726.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2007/07/05/807726.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/807726.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/807726.html</trackback:ping><description><![CDATA[摘要: &#160;要求：为一个WinForm程序暴露一个COM接口，让其它应用程序能够以COM服务器(LocalServer)方式启动这个程序并且对其进行操作如果发现已经在运行的应用程序，则直接重用当前运行的应用程序进行操作。分析：根据要求，分解具体需要解决的技术问题如下：在WinForm程序中定义一个COM visible接口并实现。将这个Winform程序变为COM服务器（LocalServer）。&nbsp;&nbsp;<a href='http://www.cnblogs.com/jonnyyu/archive/2007/07/05/807726.html'>阅读全文</a><img src ="http://www.cnblogs.com/jonnyyu/aggbug/807726.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47984/" target="_blank">《商业周刊》:Mozilla的志愿者开发模式被复制</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>控件的鼠标拖动和改变大小实现的思考</title><link>http://www.cnblogs.com/jonnyyu/archive/2007/05/27/760558.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Sun, 27 May 2007 05:15:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2007/05/27/760558.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/760558.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2007/05/27/760558.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/760558.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/760558.html</trackback:ping><description><![CDATA[<p>WinForm应用里经常会使用一些自绘的非标准窗口来改善软件的观感，由于不再使用标准窗口的标题来和边框，那么窗口的Move和Resize的功能就需要自己来实现。在我写这个功能的时候是直接在OnMouseMove中进行Location和Size的改变。这种使用这种方式后发现在Resize和Move的时候CPU占用率有时会到100%,因为MouseMove消息的产生频率非常高，基本上鼠标每移动一个像素位置都会发出一个MouseMove消息，由于我是在MouseMove中进行Resize，那么Resize的频率也会很频繁，这在一些简单的窗口中（控件少，自绘逻辑简单）的窗口中可能问题不大，但是对于一些较复杂的窗口来说，频繁的Repaint和layout的代价是巨大的。<br><br>后来尝试在Idle Event中进行Resize这样,经过一些实验发现Idle event的触发频率比MouseMove少40%，而效果却保持不变。更好的是Idle event是根据应用程序是否空闲来决定其发生频率的，这样在系统繁忙的时候，窗口resize的反应慢一点也是可以接受的，这样可以把更多的CPU资源用于需要的计算中。<br><br>这只算记个笔记备忘吧，如果有做过自绘窗口的resize功能的欢迎一起交流讨论。:)</p>
<img src ="http://www.cnblogs.com/jonnyyu/aggbug/760558.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Learn from mistake, i.e. 和 e.g. 是不同的</title><link>http://www.cnblogs.com/jonnyyu/archive/2006/09/08/498707.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Fri, 08 Sep 2006 05:28:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2006/09/08/498707.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/498707.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2006/09/08/498707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/498707.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/498707.html</trackback:ping><description><![CDATA[<font style="color: #000000;" color="#008000" size="2"></font><span style="font-size: 10pt;"><font style="color: #000000;" color="#008000" size="2"></font><span style="font-size: 12pt;"><font style="color: #000000;" color="#008000" size="2">i.e.和 e.g.这两个缩写在英语中用的很多，都是表示举例说明的意思。<br>但是同是举例，可是意思却是不同的。<br><br></font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font style="color: #000000;" color="#008000" size="2">e.g.仅仅列举一部分情况<br>
</font><font color="#008000" size="2"><span style="color: #000000;">例如：<br><br style="color: #000000;"></span>
<span style="color: #000000;">The default item (e.g. the first item in the row) .....<br><br style="color: #000000;"></span>
<span style="color: #000000;">这样的话是：缺省项（例如每行的第一项）....</span></font></span></span><br><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font style="color: #000000;" color="#008000" size="2"><br>i.e.列举了所有情况<br>例如：</font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font color="#008000" size="2"><span style="color: #000000;">把前面句子中</span></font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font color="#008000" size="2"><span style="color: #000000;"></span></font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font color="#008000" size="2"><span style="color: #000000;">e.g.</span></font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font color="#008000" size="2"><span style="color: #000000;">改成</span></font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font color="#008000" size="2"><span style="color: #000000;">i.e.</span></font></span></span><br><br><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font color="#008000" size="2"><span style="color: #000000;"></span></font></span></span><span style="font-size: 10pt;"><span style="font-size: 12pt;"><font style="color: #000000;" color="#008000" size="2">The default item (i.e. the first item in the row) .....<br><br>这里的确切意思就是：缺省项（即每行第一项）....<br><br>这里缺省项其实已经不是一个简单的举例说明而是定义了，大家读英文文档的时候一定要小心。<br></font></span><font color="#008000" size="2"><span style="color: #000000;"></span></font></span><font color="#008000" size="2"><span style="color: #000000;"></span><br><br></font><a  href="http://www.cnblogs.com/jonnyyu/admin/www.basic-learning.com/wbwt/tip116.htm"><font color="#008000" size="2"></font><font style="color: #000ffc;" color="#008000" size="2">www.basic-learning.com/wbwt/tip116.htm</font></a><font color="#008000" size="2"></font><img src ="http://www.cnblogs.com/jonnyyu/aggbug/498707.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>How can I hide a user from the Welcome Screen in Windows XP?</title><link>http://www.cnblogs.com/jonnyyu/archive/2005/12/04/290617.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Sun, 04 Dec 2005 15:26:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2005/12/04/290617.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/290617.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2005/12/04/290617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/290617.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/290617.html</trackback:ping><description><![CDATA[<P dir=ltr><FONT face=Verdana size=5>How can I hide a user from the Welcome Screen in Windows XP?</FONT></P>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>To hide a user's account from the welcome screen in Windows XP:</FONT></P>
<OL>
<LI>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>Open Registry Editor. </FONT></P>
<LI>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>In Registry Editor, navigate to the following registry key:</FONT> </P></LI></OL>
<BLOCKQUOTE>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana><TEXTAREA name=S3 rows=3 cols=50>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList</TEXTAREA></FONT></P></BLOCKQUOTE>
<OL start=3>
<LI>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>Create the following entry: </FONT></P></LI></OL>
<BLOCKQUOTE>
<P style="MARGIN-RIGHT: 30px"><I><FONT face=Verdana size=2>Username: REG_DWORD</FONT></I> 
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>(Where Username is the username of the user you want to hide from the Welcome Screen).</FONT></P></BLOCKQUOTE>
<OL start=4>
<LI>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>Assign a value of 0. </FONT></P>
<LI>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>Close Registry Editor. </FONT></P>
<LI>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>Reboot.</FONT> </P></LI></OL>
<P style="MARGIN-RIGHT: 30px"><FONT face=Verdana size=2>This will prevent the user from showing up on the welcome screen. You will need to press CTRL-ALT-DEL twice at the logon screen to get the old W2K logon style box to be able to logon to the account you've hidden. Adding a username and setting the value to 1 will cause that user, such as Administrator, to show up on the Welcome screen as well.</FONT><!-- #EndEditable --></P><img src ="http://www.cnblogs.com/jonnyyu/aggbug/290617.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>About HDC</title><link>http://www.cnblogs.com/jonnyyu/archive/2005/08/24/221409.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Tue, 23 Aug 2005 16:51:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2005/08/24/221409.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/221409.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2005/08/24/221409.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/221409.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/221409.html</trackback:ping><description><![CDATA[<P>在Window上主要有三种方法得到Client Area的一个HDC句柄。<BR>1.在WM_PAINT消息中调用 BeginPaint()方法，BeginPaint方法返回一个当前无效区域的HDC句柄，并把该无效区域设置为有效区域。所谓无效区域就是需要应用程序重新绘制的区域，反之则为有效区域。BeginPaint被调用时同时返回了一个PAINTSTRUCT结构，其中给出了本次重绘的Clip Rectangle，所有在这个rectangle之外的绘制操作都不会显示。值得注意的是Petzold在砖头里面反复强调在WM_PAINT消息处理函数中BeginPaint方法需要和EndPaint方法配对使用，还有BeginPaint中返回的HDC不能缓存起来使用。<BR>2.调用GetDC(hwnd)/ReleaseDC()来获取释放对应Client Rectangle的HDC句柄， 这个句柄没有什么预定义的Clip rectangle, 整个Client Rectangle都可以绘制。但是GetDC()得到的句柄也同样不能缓存起来，也就是说GetDC和ReleaseDC函数要在一个消息处理函数中配对出现。<BR>一个类似的API是GetWindowDC()，它用于获取整个Window的DC,(client area + non-client area)<BR>和GetDC一样必须在一次WndProc执行中释放掉，不能缓存。<BR><BR>3.调用CreateDC方法。。。还没看到，以后再写。</P><img src ="http://www.cnblogs.com/jonnyyu/aggbug/221409.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>window class, OO</title><link>http://www.cnblogs.com/jonnyyu/archive/2005/08/23/220550.html</link><dc:creator>Jonny Yu</dc:creator><author>Jonny Yu</author><pubDate>Mon, 22 Aug 2005 16:48:00 GMT</pubDate><guid>http://www.cnblogs.com/jonnyyu/archive/2005/08/23/220550.html</guid><wfw:comment>http://www.cnblogs.com/jonnyyu/comments/220550.html</wfw:comment><comments>http://www.cnblogs.com/jonnyyu/archive/2005/08/23/220550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jonnyyu/comments/commentRss/220550.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jonnyyu/services/trackbacks/220550.html</trackback:ping><description><![CDATA[Wndows中Window Management 的设计<BR>是很符合OO思想。<BR><BR>首先每个Window的定义由WNDCLASS结构定义。在WNDCLASS中我们需要给出<BR>Window class name, Window的class style, 以及Wndow Procedure，WNDCLASS还提供了申请<BR>extra class bytes 和extra window byte的能力。这两个空间可以类比的理解为class static fields和<BR>object fields。和一般的class定义一样，WNDCLASS结构定义了Window对象的状态和行为。<BR>这样凡是同类的Window不论它的位置，大小以及窗口属性如何都可以使用同一个WNDCLASS.<BR>而对于行为有所不同的Window我们亦可以通过Sub-classing的方式通过改变其中一些消息<BR>的行为得到所需的效果，这个方式事实上等同于override virtual method了，当然还有super-classing的说法。<BR>每一个WNDCLASS在使用之前必须先注册到Win32 User Module中，随后用户即可使用CreateWindow创建Window实例了，值得注意的是在CreateWindow是我们并不是获取该WNDCLASS结构的指针来说明所使用的WNDCLASS的，而是通过Window class name, 如果将这些API在C#里面重写一下就可以看到一个很熟悉的设计。<BR>class WindowManager<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; public static void RegisterWindowClass(WindowClass wc);<BR>&nbsp;&nbsp;&nbsp;&nbsp; public static IWindow CreateWindow(string windowClassName, CreateWindowParameters params);<BR>&nbsp;&nbsp;&nbsp;&nbsp; //...<BR>}<BR>没错，Factory method, 事实上我们也正是靠这个方式重用了Common Controls.<BR>这里我将返回的HWND写成IWindow接口，因为我觉得hwnd对于一系列Window function就如同this指针对于成员方法一般。hwnd应该被认为是C函数中的this指针，而不是Window对象的私有数据成员，事实上Window对象的数据封装做的非常到位，没有暴露出一个内部数据结构。<BR>思路断掉了，以后再写。。。<BR><img src ="http://www.cnblogs.com/jonnyyu/aggbug/220550.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>