设为首页收藏本站language 语言切换
查看: 1548|回复: 0
收起左侧

谈谈Java 1.5和.NET 2.0中Generics(2)

[复制链接]
发表于 2010-2-25 10:36:11 | 显示全部楼层 |阅读模式
<p >接上一篇<p >    <B>.NET 2.0 程序(使用支持Generics的Visual Studio 2005 Beta1 IDE)</B><p ><img  src="http://www.hh010.com/upload_files/article/244/9_3f87uz351799.jpg"><p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>#region Using directivesusing System;using System.Collections;using System.Collections.Generic;using System.Text;#endregionnamespace GenericTest{    class CSharpGenerics    {        private int[] m_testInt = null;        private double[] m_testDouble = null;        private String[] m_testString = null;        private int m_dataSize = 0;        private int m_loopNum = 0;        public CSharpGenerics(int dataSize, int loopNum)        {            this.m_dataSize = dataSize;            this.m_loopNum = loopNum;            prepareData(m_dataSize);        }        private void prepareData(int dataSize)        {            m_testInt = new int[dataSize];            m_testDouble = new double[dataSize];            m_testString = new String[dataSize];            for (int i = 0; i &lt; dataSize; i++)            {                m_testInt = i;                m_testDouble = i * 1.0d;                m_testString = m_testDouble.ToString();            }        }         private void testIntA()        {            long startTime = System.Environment.TickCount;            long totalInt = 0;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                LinkedList&lt;int&gt; iList = new LinkedList&lt;int&gt;();                for (int i = 0; i &lt; m_dataSize; i++)                    iList.AddTail(m_testInt);                foreach (int i in iList)                    totalInt += i;            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Generics LinkedList Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + totalInt);        }        private void testIntB()        {            long startTime = System.Environment.TickCount;            long totalInt = 0;            for(int num=0;num&lt;this.m_loopNum;num++)            {                List&lt;int&gt; iList = new List&lt;int&gt;();                for (int i = 0; i &lt; m_dataSize; i++)                    iList.Add(m_testInt);                                foreach (int i in iList)                    totalInt += i;            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Generics List       Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + totalInt);        }        private void testIntC()        {            long startTime = System.Environment.TickCount;            long totalInt = 0;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                ArrayList iList = new ArrayList();                for (int i = 0; i &lt; m_dataSize; i++)                    iList.Add(m_testInt);                foreach (Object i in iList)                    totalInt += Convert.ToInt32(i);            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Regular  ArrayList  Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + totalInt);        }        private void testDoubleA()        {            long startTime = System.Environment.TickCount;             double totalDouble = 0;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                LinkedList&lt;double&gt; dList = new LinkedList&lt;double&gt;();                for (int i = 0; i &lt; m_dataSize; i++)                    dList.AddTail(m_testDouble);                                foreach (double i in dList)                    totalDouble += i;            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Generics LinkedList Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + totalDouble);        }        private void testDoubleB()        {            long startTime = System.Environment.TickCount;            double totalDouble = 0;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                List&lt;double&gt; dList = new List&lt;double&gt;();                for (int i = 0; i &lt; m_dataSize; i++)                    dList.Add(m_testDouble);                foreach (double i in dList)                    totalDouble += i;            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Generics List       Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + totalDouble);        }        private void testDoubleC()        {            long startTime = System.Environment.TickCount;            double totalDouble = 0;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                ArrayList dList = new ArrayList();                for (int i = 0; i &lt; m_dataSize; i++)                    dList.Add(m_testDouble);                foreach (double i in dList)                    totalDouble += Convert.ToDouble(i);            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Regular  ArrayList  Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + totalDouble);        }        private void testStringA()        {            long startTime = System.Environment.TickCount;            String temp = null;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                LinkedList&lt;String&gt; sList = new LinkedList&lt;String&gt;();                for (int i = 0; i &lt; m_dataSize; i++)                    sList.AddTail(m_testString);                               foreach (String i in sList)                    temp = i.ToUpper();            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Generics LinkedList Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + temp);        }        private void testStringB()        {            long startTime = System.Environment.TickCount;            String temp = null;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                List&lt;String&gt; sList = new List&lt;String&gt;();                for (int i = 0; i &lt; m_dataSize; i++)                    sList.Add(m_testString);                foreach (String i in sList)                    temp = i.ToUpper();            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Generics List       Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + temp);        }        private void testStringC()        {            long startTime = System.Environment.TickCount;            String temp = null;            for (int num = 0; num &lt; this.m_loopNum; num++)            {                ArrayList sList = new ArrayList();                for (int i = 0; i &lt; m_dataSize; i++)                    sList.Add(m_testString);                foreach (String i in sList)                    temp = ((String)i).ToUpper();            }            long time = System.Environment.TickCount - startTime;            Console.WriteLine(&quot;Using Regular ArrayList   Takes Time: &quot; + time + &quot; millseconds. Result:&quot; + temp);        }        public static void Main(string[] args)        {            if (args.Length != 2)            {                Console.WriteLine(&quot;Usage: GenericTest dataSize loopNum&quot;);                return;            }            int dataSize = Convert.ToInt32(args[0]);            int loopNumber = Convert.ToInt32(args[1]);            CSharpGenerics obj = new CSharpGenerics(dataSize, loopNumber);            Console.WriteLine(&quot;\nValue type int test...&quot;);            obj.testIntA();            obj.testIntB();            obj.testIntC();            Console.WriteLine(&quot;\nValue type double test...&quot;);            obj.testDoubleA();            obj.testDoubleB();            obj.testDoubleC();            Console.WriteLine(&quot;\nReference type String test...&quot;);            obj.testStringA();            obj.testStringB();            obj.testStringC();        }    }}</ccid_code></pre></td></tr></table></ccid_nobr><p >    上面这两段程序几乎完全一样。有几点情况在这里要说明一下。<BR>    1.        Java和.NET都提供了Generics的LinkedList,所以我们可以直接对比这两者的性能。<BR>    2.        Java和.NET都提供了非Generics的ArrayList,即传统的ArrayList,所以我们可以直接对比这两者的性能。<BR>    3.        Java提供了Generics和非Generics的ArrayList,所以我们可以比较使用了Generics后性能的提升。这是我们今天测试的重点之一。<BR>    4.        .NET提供了非Generics的ArrayList,但是很遗憾没有Generics的ArrayList。按照微软的说法是,我们可以使用相对应的Generics List类,它和传统的ArrayList功能和意图非常相似。对比.NET中非Generics的ArrayList和Generics List性能上的差异是我们今天测试的另一个重点。<BR>    5.        由于Java的Hotspot工作特性,所以我对测试有一个外部循环,这样做的目的是使Java的Hotspot有机会对程序进行优化,从而达到最佳性能。<p >    下面是测试的结果。这里给出两组结果,分别是数据量为100000,循环次数为100和数据量为500000,循环次数为20。<p ><img  src="http://www.hh010.com/upload_files/article/244/9_ofdvnb351801.jpg"><BR><img  src="http://www.hh010.com/upload_files/article/244/9_4l8qsp351803.jpg"><p >    从上面这个图表中,我们可以得出以下结论:<BR>    1.        在所有的测试项目中,.NET 2.0的性能都要比Java 1.5的性能高出许多。为什么会有这样的结果不是我们今天要讨论的话题。我们关注的是Generics给这两种技术带来的好处。<BR>    2.        在我们前面列举的Generics的四个特点中,类型安全,二进制代码重用以及语义清晰这三个特点在Java和.NET中都得到了很好地体现。<BR>    3.        使用了Generics,Java并没有得到什么性能提升。最直接的表现就是Generics和非Generics的ArrayList在性能上几乎没有什么差异,无论是基础的数据类型,如整数,浮点数,还是参考型String对象。这一点可能会出乎很多人的意料之外。 <BR>    4.        使用了Generics,.NET的性能有了提升。尤其是整数,双精度浮点数这些数值类型(Value Type),性能成倍的提高。对于参考类型(Reference Type),性能也有比较明显的提高。<p >    下一篇让我们深入到它们的内部,看看他们内部工作的机理各是什么样的。(T111)                                 <p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-17 03:45 , Processed in 0.065561 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表