<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; 何普江</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/pujiang-he/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Sat, 26 May 2012 06:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>我也写几行简单代码来看看Java的性能</title>
		<link>http://software.intel.com/zh-cn/blogs/2008/09/20/java/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2008/09/20/java/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 03:15:17 +0000</pubDate>
		<dc:creator>何普江</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2008/09/20/java/</guid>
		<description><![CDATA[大家都说，Java性能现在已经很好啦，不能再抱着老观点去看它啦，甚至也有人说，Java性能已经超越C++了。我也相信Java虚拟机在不断优化，性能有很大提高，但要说它能超越C++，我想还是有相当难度的，当然，不排除在某些特殊情况下它能超越C++。不过眼见为实，耳听为虚，不想看那些所谓权威机构的测试结果，就自己动手吧，写几行代码权当消遣。呵呵，网上已经有人贴了这类测试代码，拿来改一下，我们就简单的计算平方和然后再取模就是了。代码写完，可以跑起来看看了。哦，我们的环境是： Windows XP Professional Service Pack 3 Intel Core2 Duo CPU T7300 @ 2.00GHz 778MHz, 2GB RAM Visual C++ 2008 Express Edition java version "1.6.0_10-beta"   运行结果(运行时间，单位为秒)：   1st 2nd 3rd Average Java 1.55 1.53 1.54 1.54 C++ 1.41 1.41 1.41 1.41 可以看到，对我的测试例而言，两者性能确实相差不大了，Java只比C++逊色那么一点点，对大多数应用而言，这点性能损失确实可以忽略不计了。 声明一下，测试结果严重依赖于测试用例，所以我的测试也不一定具有代表性，大家看看就好，不用太认真，:)   最后贴上测试用的源码： C++代码： #include "stdafx.h" #include &#60;iostream&#62; #include &#60;windows.h&#62;   using [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span style="small;"></span></p>
<p class="MsoNormal"><span style="small;"><span style="'Times New Roman';">大家都说，</span><span lang="EN-US"><span style="Times New Roman;">Java</span></span><span style="'Times New Roman';">性能现在已经很好啦，不能再抱着老观点去看它啦，甚至也有人说，</span><span lang="EN-US"><span style="Times New Roman;">Java</span></span><span style="'Times New Roman';">性能已经超越</span><span lang="EN-US"><span style="Times New Roman;">C++</span></span><span style="'Times New Roman';">了。我也相信</span><span lang="EN-US"><span style="Times New Roman;">Java</span></span><span style="'Times New Roman';">虚拟机在不断优化，性能有很大提高，但要说它能超越</span><span lang="EN-US"><span style="Times New Roman;">C++</span></span><span style="'Times New Roman';">，我想还是有相当难度的，当然，不排除在某些特殊情况下它能超越</span><span lang="EN-US"><span style="Times New Roman;">C++</span></span><span style="'Times New Roman';">。不过眼见为实，耳听为虚，不想看那些所谓权威机构的测试结果，就自己动手吧，写几行代码权当消遣。呵呵，网上已经有人贴了这类测试代码，拿来改一下，我们就简单的计算平方和然后再取模就是了。代码写完，可以跑起来看看了。哦，我们的环境是：</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">Windows XP Professional Service Pack 3</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">Intel Core2 Duo CPU T7300 @ 2.00GHz</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">778MHz, 2GB RAM</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">Visual C++ 2008 Express Edition</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">java version "1.6.0_10-beta"</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="small;"><span style="'Times New Roman';">运行结果</span><span lang="EN-US"><span style="Times New Roman;">(</span></span><span style="'Times New Roman';">运行时间，单位为秒</span><span lang="EN-US"><span style="Times New Roman;">)</span></span><span style="'Times New Roman';">：</span></span></p>
<table class="MsoTableGrid" style=".5pt solid windowtext" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="yes">
<td style="windowtext 1pt solid;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;"> </span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;">1<sup>st</sup></span></span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;">2<sup>nd</sup></span></span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;">3<sup>rd</sup></span></span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">Average</span></span></p>
</td>
</tr>
<tr style="1">
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">Java</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.55</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.53</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.54</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.54</span></span></p>
</td>
</tr>
<tr style="yes">
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">C++</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.41</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.41</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.41</span></span></p>
</td>
<td style="solid windowtext .5pt;" width="114" valign="top">
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">1.41</span></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="small;"><span style="'Times New Roman';">可以看到，对我的测试例而言，两者性能确实相差不大了，</span><span lang="EN-US"><span style="Times New Roman;">Java</span></span><span style="'Times New Roman';">只比</span><span lang="EN-US"><span style="Times New Roman;">C++</span></span><span style="'Times New Roman';">逊色那么一点点，对大多数应用而言，这点性能损失确实可以忽略不计了。</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="small;"><span style="'Times New Roman';">声明一下，测试结果严重依赖于测试用例，所以我的测试也不一定具有代表性，大家看看就好，不用太认真，:)</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="'Times New Roman';"><span style="small;">最后贴上测试用的源码：</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="small;"><span lang="EN-US"><span style="Times New Roman;">C++</span></span><span style="'Times New Roman';">代码：</span></span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">#include</span><span style="yes;"> <span style="#a31515;">"stdafx.h"</span></span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">#include</span><span style="yes;"> <span style="#a31515;">&lt;iostream&gt;</span></span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">#include</span><span style="yes;"> <span style="#a31515;">&lt;windows.h&gt;</span></span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">using</span><span style="yes;"> <span style="#0000ff;">namespace</span> std;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">class</span><span style="yes;"> TimeRecorder</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">{</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">public</span><span style="yes;">:</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>TimeRecorder() { Start(); }</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">void</span> Start() { m_start = GetTickCount(); }</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">void</span> Stop() { m_end = GetTickCount(); }</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">double</span> GetInterval() { <span style="#0000ff;">return</span> (m_end - m_start)/1000.0; }</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">private</span><span style="yes;">:</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>DWORD m_start;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>DWORD m_end;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">};</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">int</span><span style="yes;"> g_result;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">double</span><span style="yes;"> compute(<span style="#0000ff;">int</span> maxVal, <span style="#0000ff;">int</span> modNum)</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">{</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>TimeRecorder timer;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">int</span> result = 0;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">for</span> (<span style="#0000ff;">int</span> i = 1; i &lt; maxVal; i++)</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>{</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="2">         </span>result += i * i;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="2">         </span>result %= modNum;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>}</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#008000;">// </span></span><span style="yes;">有些<span lang="EN-US">ugly, </span>不过不加此句的话上面的计算过程会被完全忽略掉<span lang="EN-US">, </span>运行时间为<span lang="EN-US">0, <img src='http://software.intel.com/zh-cn/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>g_result = result;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>timer.Stop();</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">return</span> timer.GetInterval();</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">}</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">int</span><span style="yes;"> _tmain(<span style="#0000ff;">int</span> argc, _TCHAR* argv[])</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">{</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">double</span> time = 0.0;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span><span style="#0000ff;">for</span> (<span style="#0000ff;">int</span> i = 100000; i &lt; 1000000; i += 100000)</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>{</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="2">         </span><span style="#0000ff;">for</span> (<span style="#0000ff;">int</span> j = 100000; j &lt; 1000000; j += 100000)</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="2">         </span>{</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="3">              </span>time += compute(i, j);</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="2">         </span>}</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>}</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"><span style="1">     </span>cout &lt;&lt; time &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;">}</span></p>
<p class="MsoNormal" style="none" align="left"><span style="yes;"> </span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span style="small;"><span lang="EN-US"><span style="Times New Roman;">Java</span></span><span style="'Times New Roman';">代码：</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">import java.util.Arrays;</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">public class GeneratePrimes </span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">{</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>public static double compute(int maxVal, int modNum)</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>{</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>long start = System.currentTimeMillis();</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="yes"><span style="Times New Roman;">    </span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>int result = 0;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>for (int i = 1; i &lt; maxVal; i++)</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>{</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>result += i * i;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>result %= modNum;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>}</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>g_result = result;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="yes"><span style="Times New Roman;">      </span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">      </span>return (System.currentTimeMillis() - start)/1000.0;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>}</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="yes"><span style="Times New Roman;">    </span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>public static void main(String args[])</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>{</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>double time = 0.d;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>for (int i = 100000; i &lt; 1000000; i += 100000)</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>{</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">          </span>for (int j = 100000; j &lt; 1000000; j += 100000)</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">          </span>{</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">            </span>time += compute(i, j);</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">          </span>}</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>}</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">        </span>System.out.println(time);</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>}</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="yes"><span style="Times New Roman;">    </span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="small;"><span style="Times New Roman;"><span style="yes">    </span>public static int g_result;</span></span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt"><span lang="EN-US"><span style="Times New Roman;">}</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2008/09/20/java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>My insight C++——C++中的隐式计数</title>
		<link>http://software.intel.com/zh-cn/blogs/2008/08/31/my-insight-cc/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2008/08/31/my-insight-cc/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 13:03:03 +0000</pubDate>
		<dc:creator>何普江</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2008/08/31/my-insight-cc/</guid>
		<description><![CDATA[&#60;!--[if gte mso 9]&#62; Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4 &#60;![endif]--&#62;&#60;!--[if gte mso 9]&#62; &#60;![endif]--&#62; C++是一种广泛使用的语言，也曾有兴趣略作研究。因为最近一段时间估计不会用它进行开发了，静下心来，谈谈我对它的理解或是发现。   (1) 引子 本文谈一谈C++中的隐式计数。隐式计数是一个计数器，因为他的储存空间没有显示的体现在程序代码中，故称之为“隐式”，而“计数”是说该存储空间的功能。这么一说，你首先想到的可能是C++中的new []和delete []操作符，不错，用new分配一个数组时，正是使用了“隐式计数”，才使得delete该数组指针时，能够获取到数组元素的个数，请看下面的代码，或许你并不陌生： struct Test { Test() { cout &#60;&#60; "Test()" &#60;&#60; endl; } ~Test() { cout &#60;&#60; "~Test()" &#60;&#60; endl; } }; int main() { Test *p = new Test[2]; *((int [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;!--[if gte mso 9]&gt; Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4 &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt; &lt;![endif]--&gt;</p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">C++</span><span style="宋体;">是一种广泛使用的语言，也曾有兴趣略作研究。因为最近一段时间估计不会用它进行开发了，静下心来，谈谈我对它的理解或是发现。</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">(1) </span><span style="宋体;">引子</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">本文谈一谈</span><span lang="EN-US">C++</span><span style="宋体;">中的隐式计数。隐式计数是一个计数器，因为他的储存空间没有显示的体现在程序代码中，故称之为“隐式”，而“计数”是说该存储空间的功能。这么一说，你首先想到的可能是</span><span lang="EN-US">C++</span><span style="宋体;">中的</span><span lang="EN-US">new []</span><span style="宋体;">和</span><span lang="EN-US">delete []</span><span style="宋体;">操作符，不错，用</span><span lang="EN-US">new</span><span style="宋体;">分配一个数组时，正是使用了“隐式计数”，才使得</span><span lang="EN-US">delete</span><span style="宋体;">该数组指针时，能够获取到数组元素的个数，请看下面的代码，或许你并不陌生：</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">struct Test</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">Test() { cout &lt;&lt; "Test()" &lt;&lt; endl; }</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">~Test() { cout &lt;&lt; "~Test()" &lt;&lt; endl; }</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">};</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">int main()</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">Test *p = new Test[2];</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">*((int *)p - 1) = 1;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">delete[] p;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">return 0;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">看看输出吧，构造函数被调用两次，析构函数被调用一次</span><span lang="EN-US">(</span><span style="宋体;">在</span><span lang="EN-US">VC6.0</span><span style="宋体;">和</span><span lang="EN-US">gcc</span><span style="宋体;">中均是如此</span><span lang="EN-US">)</span><span style="宋体;">，毫无疑问，</span><span lang="EN-US">(int *)p - 1</span><span style="宋体;">的位置就是一个计数器，它记录了数组数组元素的个数。</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">(2) </span><span style="宋体;">示例</span><span lang="EN-US">1</span><span style="宋体;">——</span><span lang="EN-US">string</span><span style="宋体;">中的隐式计数</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">我们再来看看下面关于</span><span lang="EN-US">std::string</span><span style="宋体;">的例子：</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">int main()</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">string s1("Hello");</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">string s2 = s1;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">char *p = const_cast&lt;char *&gt;(s2.c_str());</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">p[0] = 'M';</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">cout &lt;&lt; s1 &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">return 0;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">上面的程序输出什么？是“</span><span lang="EN-US">Hello</span><span style="宋体;">”吗？答案是不一定</span><span lang="EN-US">(</span><span style="宋体;">我在</span><span lang="EN-US">gcc 3.4.6</span><span style="宋体;">中是</span><span lang="EN-US">Mello)</span><span style="宋体;">。这实际上取决于</span><span lang="EN-US">string</span><span style="宋体;">类的实现，如果</span><span lang="EN-US">string</span><span style="宋体;">采用了</span><span lang="EN-US">copy on write</span><span style="宋体;">的机制，那么</span><span lang="EN-US">s1</span><span style="宋体;">和</span><span lang="EN-US">s2</span><span style="宋体;">实际上共享同一段内存，因此上面的代码也修改了</span><span lang="EN-US">s1</span><span style="宋体;">的内容。当然，这都是</span><span lang="EN-US">const_cast</span><span style="宋体;">惹的祸，常规代码对</span><span lang="EN-US">s1</span><span style="宋体;">和</span><span lang="EN-US">s2</span><span style="宋体;">都是能正常工作的。</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">上面提到了</span><span lang="EN-US">copy on write</span><span style="宋体;">的共享机制，那么，程序又是如何决定什么时候删除该共享内存呢</span><span lang="EN-US">?</span><span style="宋体;">答案是引用计数，如果你有兴趣，你可以查看</span><span lang="EN-US">p</span><span style="宋体;">指针的前</span><span lang="EN-US">4</span><span style="宋体;">个字节，发现其值为</span><span lang="EN-US">1</span><span style="宋体;">，而再添加一个“</span><span lang="EN-US">string s3 = s1;</span><span style="宋体;">”后，其值变为</span><span lang="EN-US">2</span><span style="宋体;">，毫无疑问，这正是一个引用计数。</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">(3) </span><span style="宋体;">示例</span><span lang="EN-US">2</span><span style="宋体;">——</span><span lang="EN-US">static</span><span style="宋体;">中的隐式计数</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">再看一个关于</span><span lang="EN-US">static</span><span style="宋体;">局部变量的例子。我们知道，如果函数中的</span><span lang="EN-US">static</span><span style="宋体;">变量在定义时赋初值，那么只有在第一次调用该函数时，初始化才被执行，以后的调用都不再执行。那么，编译器又是怎么实现的呢？答案很简单，就是一个标志位，程序初始化时该标志位为</span><span lang="EN-US">0</span><span style="宋体;">，函数中初始化相关的代码则演变为：检查标志位，如果是</span><span lang="EN-US">0</span><span style="宋体;">，则对变量进行初始化，然后将标志位置</span><span lang="EN-US">1</span><span style="宋体;">，否则跳过初始化步骤。这个标志位实际上就是一个隐式的计数器，虽然它只是一个</span><span lang="EN-US">0-1</span><span style="宋体;">计数。</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">知道了编译器的这个“内幕”，你可以用下面的代码轻易的绕过初始化检查，让函数中的</span><span lang="EN-US">static</span><span style="宋体;">变量在每次被调用时都被初始化</span><span lang="EN-US">(</span><span style="宋体;">代码有些</span><span lang="EN-US">BT</span><span style="宋体;">，不适者勿看</span><span lang="EN-US">)</span><span style="宋体;">。</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">void Test(int initVal)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">static int i = initVal;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">cout &lt;&lt; i &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">++i;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">int FindAddress()</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">unsigned char *addr = (unsigned char *)&amp;Test;</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">// There is only one instruction in Test: jmp realAddr</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">if (*addr == 0xe9)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">addr = addr + *(int *)(addr + 1) + 5;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">// Look forward at most 100 bytes for instruction "and eax 1"</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">for (int i = 0; i &lt; 64; i++)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">#ifdef WIN32</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">if (memcmp(addr + i, "\x83\xe0\x01", 3) == 0)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">return *(int *)(addr + i - 4);</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">#else</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">if (addr[i+0] == 0x80 &amp;&amp; addr[i+1] == 0x3d &amp;&amp; addr[i+6] == 0x00)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">return *(int *)(addr + i + 2);</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">#endif</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">return 0;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">int main()</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">cout &lt;&lt; "before modify: " &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">Test(0);</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">Test(100);</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">try</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">int flagAddress = FindAddress();</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">if (flagAddress)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">cout &lt;&lt; "After modify: " &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">*reinterpret_cast&lt;int *&gt;(flagAddress) = 0;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">Test(1000);</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">else</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">cout &lt;&lt; "Can not find the flag address" &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">catch (...)</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">{</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">cout &lt;&lt; "There is some bug in program" &lt;&lt; endl;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">return 0;</span></p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">代码的讲解我就不说了，注意的是</span><span lang="EN-US">FindAddress</span><span style="宋体;">函数，其中尝试查找某种特征的指令。</span></p>
<p class="MsoNormal" style="21pt;"> </p>
<p class="MsoNormal" style="21pt;"><span lang="EN-US">(4) </span><span style="宋体;">总结</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">上面举了几个“隐式计数”的例子，它们可能是编译器为了在程序中实现代码面上的功能，而在其中添加的额外数据结构，也可能是库源码中为你所不熟悉的数据结构(如string中的隐式计数)。了解这些深层次的实现，对查排错误或是提高效率都不无裨益。</span></p>
<p class="MsoNormal" style="21pt;"><span style="宋体;">很少写文章，</span><span style="宋体;">写这篇文章的目的，只是希望下次你在用到</span><span style="&quot;Times New Roman&quot;;" lang="EN-US">C++</span><span style="宋体;">的某个比较“怪异”的特性时，也能有自己的发现, <img src='http://software.intel.com/zh-cn/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2008/08/31/my-insight-cc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PERL &amp; SHELL</title>
		<link>http://software.intel.com/zh-cn/blogs/2008/08/22/perl-amp-shell/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2008/08/22/perl-amp-shell/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 09:23:07 +0000</pubDate>
		<dc:creator>何普江</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2008/08/22/perl-amp-shell/</guid>
		<description><![CDATA[众所周知，perl处理字符串的功能十分强大，然而，作为一种语言，强大是一回事，简单方便则是另外一回事。 今天就遇到一个例子，是这样的，想要在xen上获取某个虚拟机的CPU使用率，于是使用命令“xentop -b -i 2 &#62; /tmp/xentop.tmp”，获得类似下面的数据：       NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR SSID   Domain-0 -----r       1042    0.0     914432   44.6   no limit       n/a     2    0        0        0    0        0        0        0 2148573580           VM1 --b---         70    0.0     532352   26.0     540672      26.4     1    0        0        [...]]]></description>
			<content:encoded><![CDATA[<p>众所周知，perl处理字符串的功能十分强大，然而，作为一种语言，强大是一回事，简单方便则是另外一回事。<br />
今天就遇到一个例子，是这样的，想要在xen上获取某个虚拟机的CPU使用率，于是使用命令“xentop -b -i 2 &gt; /tmp/xentop.tmp”，获得类似下面的数据：<br />
      NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR SSID<br />
  Domain-0 -----r       1042    0.0     914432   44.6   no limit       n/a     2    0        0        0    0        0        0        0 2148573580<br />
          VM1 --b---         70    0.0     532352   26.0     540672      26.4     1    0        0        0    1        0        0        0 2148573580<br />
      NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR SSID<br />
  Domain-0 -----r       1042    2.4     914432   44.6   no limit       n/a     2    0        0        0    0        0        0        0 2148573580<br />
          VM1 --b---         70    0.8     532352   26.0     540672      26.4     1    0        0        0    1        0        0        0 2148573580</p>
<p>对我们有用的是后半部分(也就是xentop第二次计算出的数据)，假设我们要提取VM1的CPU使用率，熟悉shell命令的知道，只需要使用下面的命令就可以了：<br />
cat /tmp/xentop.tmp | grep VM1 | tail -n 1 | awk '{print \$4}'<br />
而如果用perl来实现的话呢，一种很自然的处理方式是：先将xentop的结果按行进行split，然后对每一行进行分析，找到以VM1打头的最后一行，接着再将该行用空格进行split，最后取得结果中的第4项数据。呵呵，split就需要两次，也够麻烦的了。这个问题我跟dahong探讨了一下，他大体也是这个思路，不过他好像也不是perl的高级用户，:)<br />
或许perl也有类似shell的“一行式”解决方法吧，只是我不知道而已，知道的告知一声啊，呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2008/08/22/perl-amp-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

