love fish大鵬一曰同風(fēng)起,扶搖直上九萬(wàn)里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評(píng)論

          關(guān)于聲明變量的性能問(wèn)題 (轉(zhuǎn))

          開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) (問(wèn)題結(jié)束)

          在我們編程的過(guò)程中經(jīng)常會(huì)遇到這樣的問(wèn)題。
          for?(int?i=0;i<n;i++){
          ????String?str?
          =?//
          }

          String?str?
          =?null;
          for(int?i=0;i<n;i++){
          ????str?
          =?//
          }



          在印象中一直認(rèn)為方法二的性能好于方法一,但是差距應(yīng)該很小。但因?yàn)橐晃粍e人的回文說(shuō)方法一極大的影響了性能,所以想寫(xiě)個(gè)例子證明一下相差很小。例子如下:
          public?class?TestOt?{
          ????
          public?static?void?main(String[]?args)?{
          ????????
          long?n=1000000000;
          ????????
          long?start?=?System.currentTimeMillis();
          ????????test2(n);
          ????????
          long?end?=?System.currentTimeMillis();
          ????????System.out.println(end
          -start);
          ????}

          ????
          public?static?void?test1(long?n){
          ????????
          for?(int?i=0;i<n;i++){
          ????????????String?str?
          =?"";
          ????????}

          ????}

          ????
          public?static?void?test2(long?n){
          ????????String?str?
          =?null;
          ????????
          for?(int?i=0;i<n;i++){
          ????????????str?
          =?"";
          ????????}

          ????}

          }
          測(cè)試的結(jié)果是當(dāng)n=10億次的時(shí)候差距是1秒,所以說(shuō)差距應(yīng)該是很小的,符合我原始的記憶,但是另一個(gè)問(wèn)題來(lái)了,測(cè)試的結(jié)果是
          方法一:3300毫秒左右
          方法二:4300毫秒左右
          結(jié)果剛好相反,于是更改方法

          public?class?TestOt?{
          ????
          public?static?void?main(String[]?args)?{
          ????????
          long?n=1000000000;
          ????????
          long?start?=?System.currentTimeMillis();
          ????????test1(n);
          ????????
          long?end?=?System.currentTimeMillis();
          ????????System.out.println(end
          -start);
          ????}

          ????
          public?static?void?test1(long?n){
          ????????
          for?(int?i=0;i<n;i++){
          ????????????String?str?
          =?null;
          ????????}

          ????}

          ????
          public?static?void?test2(long?n){
          ????????String?str?
          =?null;
          ????????
          for?(int?i=0;i<n;i++){
          ????????}

          ????}

          }

          結(jié)果依舊。

          沒(méi)辦法,取得字節(jié)碼,對(duì)比
          public?class?TestOt?extends?java.lang.Object{
          public?TestOt();
          ??Code:
          ???
          0:???aload_0
          ???
          1:???invokespecial???#8;?//Method?java/lang/Object."<init>":()V
          ???4:???return

          public?static?void?test1(int);
          ??Code:
          ???
          0:???iconst_0
          ???
          1:???istore_1
          ???
          2:???goto????10???
          ???
          5:???aconst_null
          ???
          6:???astore_2
          ???
          7:???iinc????1,?1
          ???
          10:??iload_1???
          ???
          11:??iload_0
          ???
          12:??if_icmplt???????5
          ???
          15:??return

          public?static?void?test2(int);
          ??Code:
          ???
          0:???aconst_null
          ???
          1:???astore_1
          ???
          2:???iconst_0
          ???
          3:???istore_2
          ???
          4:???goto????10???
          ???
          7:???iinc????2,?1
          ???
          10:??iload_2???
          ???
          11:??iload_0??
          ???
          12:??if_icmplt???????7
          ???
          15:??return
          }

          結(jié)果是感覺(jué)還是應(yīng)該是方法二快,那為什么反而方法一快了1秒左右呢?
          不得而知,現(xiàn)在我個(gè)人猜測(cè)的想法是可能有兩種情況:
          1,JLS的底層定義決定的,有什么特殊的優(yōu)化?
          2,因?yàn)榉椒ǘ确椒ㄒ浑m然少了在循環(huán)中的部分,但是引用的聲明周期反而是更長(zhǎng)了,是否因?yàn)橐么嬖谠斐闪朔椒ǘ臈2僮飨牧舜蟛糠謺r(shí)間?
          猜想一有待于JLS文檔的查閱,我會(huì)在有空的時(shí)候查詢,猜想二正在想辦法證明。
          看文章的朋友,如果誰(shuí)了解麻煩指點(diǎn)一下,是我的測(cè)試方法寫(xiě)的有問(wèn)題,還是別的原因,謝謝。

          最后:?jiǎn)栴}已經(jīng)基本了解了原因,見(jiàn)回復(fù)中的討論,謝謝--daydream 的幫忙。


          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 03:29 dreamstone

          最開(kāi)始的測(cè)試是在Eclipse中測(cè)試的,怕是eclipse的問(wèn)題,在控制臺(tái)下也做了測(cè)試,雖然得到的數(shù)字有微小偏差,但依然是方法一比方法二快1秒左右。問(wèn)題繼續(xù)。。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 06:10 JonneyQuest

          據(jù)說(shuō)是因?yàn)榫植孔兞糠旁诙褩V械脑颉??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 09:26 daydream

          在我的機(jī)器上測(cè)試,兩者可以看作是一樣快的。對(duì)每一個(gè)方法運(yùn)行多次,結(jié)果也會(huì)稍有偏差,第一個(gè)方法:3375(次數(shù)比較多)、3390。
          第二個(gè)方法:3375(次數(shù)比較多)、3390、3391、3406。

          對(duì)于下面2段代碼來(lái)說(shuō):
          for (int i=0;i<n;i++){
          String str = //
          }
          String str = null;
          for(int i=0;i<n;i++){
          str = //
          }
          區(qū)別只是str變量的作用域不同---意味著:代碼1的str變量的偏移位置在出了循環(huán)的作用域以后,可以被分配給下一個(gè)出現(xiàn)的局部變量,而代碼2str的位置會(huì)一直占有,直到方法結(jié)束。

          之所以,有人感覺(jué)代碼2快,我想是一種錯(cuò)覺(jué)吧,就是以為代碼1會(huì)在循環(huán)中重復(fù)聲明變量str--實(shí)際上不是這樣。

          另外,JLS是什么東東???回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題)[未登錄](méi) 2007-02-11 10:32 dreamstone

          to:JonneyQuest
          詳細(xì)說(shuō)說(shuō)?
          ??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題)[未登錄](méi) 2007-02-11 10:36 dreamstone

          to:daydream
          你怎么運(yùn)行的,不是兩個(gè)一塊調(diào)用的吧,如果是用循環(huán)多次調(diào)用求平均值,活著兩個(gè)一塊調(diào)用是不準(zhǔn)的。如果你是循環(huán)調(diào)用,活著同時(shí)調(diào)用,你可以把兩個(gè)函數(shù)的調(diào)用順序換一下,會(huì)有較大的差距。
          JLS=The Java Language Specification
          講述的是Java語(yǔ)言的特性,很多東西C++和Java是不同的,JLS中有描述。例如lazyloading的單態(tài)在Java中是不可實(shí)現(xiàn)的,這個(gè)就因?yàn)镴ava的優(yōu)化造成的,通過(guò)JLS可以查到。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 12:40 daydream

          沒(méi)有,我是分開(kāi)運(yùn)行的,直接運(yùn)行你的代碼。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 13:55 sinoly

          這里問(wèn)題大了。創(chuàng)建對(duì)象第一忌:不要在循環(huán)體中創(chuàng)建對(duì)象。這種做法會(huì)在內(nèi)存中保存N份這個(gè)對(duì)象的引用會(huì)浪費(fèi)大量的內(nèi)存空間(雖說(shuō)內(nèi)存便宜,可以進(jìn)行硬件升級(jí)),同時(shí)JVM的GC機(jī)制會(huì)因?yàn)檫@些無(wú)謂的對(duì)象做大量的回收工作,系統(tǒng)不慢都不行呀
          .........................................................................................

          很簡(jiǎn)單的一個(gè)道理,你用String對(duì)象根本看不出效果。如果你換成個(gè)自定義對(duì)象或者圖形對(duì)象呢?你的第一種做法會(huì)在堆內(nèi)存中生成大量的垃圾對(duì)象,這些對(duì)象首先占用內(nèi)存,二則在對(duì)于速度的影響上它不會(huì)馬上體現(xiàn)出來(lái)(畢竟在內(nèi)存夠用的情況下無(wú)法體現(xiàn)),一旦堆內(nèi)存中的eden area滿了,GC機(jī)制開(kāi)始起作用了那么你就會(huì)覺(jué)得你的程序速度狂降。。。。
          所以說(shuō),第二種做法才是王道!

          呵呵,剛剛寫(xiě)了一篇關(guān)于java優(yōu)化編程的文字,希望可以提供幫助
          http://www.aygfsteel.com/sinoly/archive/2007/02/11/99205.html??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 14:05 sinoly

          相對(duì)而言,性能的影響并不只是這段代碼的執(zhí)行速度。需要考慮在JVM種它的處理方式,以及這種方式對(duì)資源占用的情況。很多性能問(wèn)題都是在日積月累中體現(xiàn)的。只是丂一條語(yǔ)句所謂的執(zhí)行速度來(lái)判斷效率,個(gè)人感覺(jué)很不合理??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 17:05 daydream

          to sinoly :

          “創(chuàng)建對(duì)象第一忌:不要在循環(huán)體中創(chuàng)建對(duì)象。這種做法會(huì)在內(nèi)存中保存N份這個(gè)對(duì)象的引用會(huì)浪費(fèi)大量的內(nèi)存空間”

          這是誤解。完全沒(méi)有在內(nèi)存中保存N份對(duì)象的引用,循環(huán)體內(nèi)聲明的對(duì)象也只是在java棧中占據(jù)一個(gè)位置。

          反而在循環(huán)體內(nèi)聲明的對(duì)象因?yàn)槠渥饔糜蛑皇窃谘h(huán)體內(nèi),更節(jié)約內(nèi)存(雖然微乎其微)。
          ??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題)[未登錄](méi) 2007-02-11 17:06 dreamstone

          to:sinoly
          我在平時(shí)寫(xiě)代碼的時(shí)候也不是在循環(huán)體內(nèi)創(chuàng)建,但是記憶中差別不大。
          對(duì)于你的說(shuō)法,
          1,String看不出效果,自定義對(duì)象和圖形對(duì)象能有效果?
          在印象中無(wú)論是什么,這里保留的都是一個(gè)引用,應(yīng)該是一樣大的。所以應(yīng)該沒(méi)有對(duì)象和圖形的差別。而且第一種做法不會(huì)產(chǎn)生垃圾對(duì)象,只會(huì)出現(xiàn)大量的引用。一個(gè)引用占用的內(nèi)存是很小的,不會(huì)是大量的。但是如果循環(huán)次數(shù)很多,也是可觀的,所以我平時(shí)也是寫(xiě)在循環(huán)體之外。
          2,如果寫(xiě)在外邊,其實(shí)并不一定就快,因?yàn)樵诶镞厡?xiě)的話過(guò)了循環(huán)體就過(guò)了它的有效范圍,可以被回收了,雖然并不一定立即回收,但如果第二種寫(xiě)法對(duì)象則不能回收。恰恰相反,如果對(duì)象很大,例如圖形控件,活著保存大量數(shù)據(jù)的Bean,這個(gè)時(shí)候這個(gè)對(duì)象要到函數(shù)結(jié)束才會(huì)被回收,如果函數(shù)體很長(zhǎng),活著函數(shù)的執(zhí)行時(shí)間很長(zhǎng),那么這個(gè)才是更消耗內(nèi)存的。所以說(shuō)哪種寫(xiě)法要看情況而定。
          3,如何判定一個(gè)程序的好壞?這個(gè)是個(gè)綜合問(wèn)題,要考慮很多因素,但是在印象種無(wú)論如何方法二應(yīng)該是比方法一快的,結(jié)果剛好相反,開(kāi)啟這個(gè)帖子主要是為了這個(gè)問(wèn)題。就是為什么會(huì)這樣?而不是討論哪個(gè)方法更好。
          ??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 17:17 daydream

          java字節(jié)碼中,對(duì)于每一個(gè)方法都有一個(gè)max_locals屬性,指出方法的局部變量所需要的存儲(chǔ)空間(以字為單位)。

          對(duì)于一樓的例子,如果把
          String str = //
          移到循環(huán)體外,則max_locals會(huì)比在循環(huán)體內(nèi)更大。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題)[未登錄](méi) 2007-02-11 17:35 dreamstone

          to:sinoly
          看了你寫(xiě)的關(guān)于對(duì)象創(chuàng)建的問(wèn)題,我們說(shuō)的不是一個(gè)問(wèn)題啊。
          你的問(wèn)題是:在循環(huán)體種創(chuàng)建相同的對(duì)象,就是作用一樣的對(duì)象,這個(gè)當(dāng)然是浪費(fèi)內(nèi)存了。這種問(wèn)題不需要再討論。
          我的問(wèn)題是這樣的,并不再創(chuàng)建對(duì)象上,例如,如下問(wèn)題,從List種取出對(duì)象,可以有兩種寫(xiě)法,
          List<Object> list= //...一個(gè)已經(jīng)存在的List
          方法一
          for(int i=0;i<list.size();i++){
          Object obj = list.get(i);
          }
          方法二
          Object obj= null;
          for(int i=0;i<list.size();i++){
          obj= list.get(i);
          }
          這個(gè)里邊根本沒(méi)有創(chuàng)建對(duì)象的問(wèn)題,有的問(wèn)題是方法一會(huì)多很多引用,方法二會(huì)讓一個(gè)引用保存期很長(zhǎng),同時(shí)對(duì)象有效期也變的很長(zhǎng)。(其實(shí)你的性能優(yōu)化的文章種應(yīng)該指出這個(gè)問(wèn)題的。)

          另外提示一下,對(duì)于我第一個(gè)例子中寫(xiě)的:
          for (int i=0;i<n;i++){
          String str = "";
          }
          在這個(gè)函數(shù)中只會(huì)創(chuàng)建一個(gè)對(duì)象,因?yàn)镾tring是非可變對(duì)象,虛擬機(jī)會(huì)自動(dòng)重用,這個(gè)你可以參照一下JLS中的解釋。只有這種情況才是浪費(fèi)
          for (int i=0;i<n;i++){
          String str = new String("");
          }
          最后感謝你參與,另外提一點(diǎn)建議:
          1,回文或者寫(xiě)文章前應(yīng)該先確認(rèn)一下自己的觀點(diǎn)是否是對(duì)的,最好給出證明,雖然確認(rèn)了也不能保證一定是對(duì)的,但是至少做過(guò)了,這是一種態(tài)度。我也是一直這么要求自己,無(wú)論多么簡(jiǎn)單的問(wèn)題,都給出一個(gè)思考的過(guò)程,因?yàn)檫@樣對(duì)看文章的人有幫助。例如你上邊說(shuō)到的,如果是自定義對(duì)象活著圖形對(duì)象的觀點(diǎn),剛好是錯(cuò)誤的證明,你可以這樣試試。虛擬機(jī)內(nèi)存設(shè)置64M,如果你在List中取出一個(gè)60M的對(duì)象,然后在循環(huán)之后再new一個(gè)10M的對(duì)象,方法一是可以運(yùn)行的,雖然說(shuō)慢,但方法二就OutOfMemory了。除非你在循環(huán)之后設(shè)置
          變量= null,但這種做法是否更好只得商榷.

          最后說(shuō)明一點(diǎn),應(yīng)用開(kāi)發(fā)和底層框架開(kāi)發(fā)其實(shí)有很多東西是不同的。如果實(shí)際負(fù)責(zé)過(guò)項(xiàng)目就了解的。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 17:41 dreamstone

          @daydream
          謝謝再次回復(fù),想問(wèn)一下關(guān)于max_locals這個(gè)屬性,
          1,為什么放到循環(huán)體外反而會(huì)更大呢?能給簡(jiǎn)單講一下為什么嗎?活著給一個(gè)能查到原因的方向。
          2,另外這個(gè)max_locals變大后為什么會(huì)影響性能呢?在什么時(shí)候會(huì)使用到max_locals這個(gè)屬性呢?
          謝謝
          ??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 18:40 daydream

          對(duì)下面2個(gè)方法,foo1需要的max_locals是4,foo2是5,

          foo1需要的4大概是:this變量占1個(gè)字、方法參數(shù)x占1個(gè)字、
          第一段循環(huán)的時(shí)候,變量i占一個(gè)字、s1占一個(gè)字,第二個(gè)循環(huán)的時(shí)候,i、s1已經(jīng)超出作用域,所以,變量j、s2占用了和i、s1重疊的空間,所以最多需要4個(gè)字就夠了。

          foo2方法中s1的作用域直到方法結(jié)束,所以需要5個(gè)字長(zhǎng)度。

          max_locals變大后應(yīng)該不會(huì)影響到性能,但是我這兒的意思是說(shuō),將局部變量放在循環(huán)體內(nèi)聲明并不會(huì)導(dǎo)致性能下降。

          void foo1(int x) {
          for (int i = 0; i < 1000; i++) {
          String s1 = "...";
          }
          for (int j = 0; j < 1000; j++) {
          String s2 = "....";
          }
          }

          void foo2(int x) {
          String s1 = "...";
          for (int i = 0; i < 1000; i++) {
          // other code.....
          }
          for (int j = 0; j < 1000; j++) {
          String s2 = "....";
          }
          }
          ??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 18:44 daydream

          另外,將局部變量放在循環(huán)體內(nèi)聲明,也不會(huì)導(dǎo)致多出來(lái)很多引用。
          因?yàn)?,局部變量?duì)應(yīng)于java棧的偏移是在編譯時(shí)就確定的,并不是在運(yùn)行期動(dòng)態(tài)分配的。循環(huán)體內(nèi)的局部變量對(duì)應(yīng)的是同一個(gè)偏移位置。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 18:48 daydream

          另外,max_locals只是編譯器在編譯時(shí)確定,存放在字節(jié)碼中,供JVM在運(yùn)行期調(diào)用方法時(shí)分配java棧幀大小用的,對(duì)于程序員應(yīng)該沒(méi)什么用,因?yàn)槌绦蛞矝](méi)辦法訪問(wèn)java棧。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 19:07 dreamstone

          現(xiàn)在大概明白了max_locals的作用,但是我這測(cè)試出的問(wèn)題還在。不知道為什么第一個(gè)方法要比第二個(gè)方法快。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 19:10 dreamstone

          另外我看你上邊寫(xiě)的用我的代碼,測(cè)試結(jié)果是接近的,可我怎么測(cè)都是差距一秒啊,你的運(yùn)行環(huán)境 ?
          我是xp下,試過(guò)eclipse運(yùn)行,試過(guò)直接控制臺(tái)用java命令運(yùn)行。
          jdk1.5??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) 2007-02-11 19:37 daydream

          運(yùn)行你的第二段測(cè)試代碼:
          先運(yùn)行test1共5次,結(jié)果:3406、3453、3391、3453、3391
          然后把代碼改成test2,運(yùn)行5次,結(jié)果:
          3406、3406、3406、3437、3391

          運(yùn)行環(huán)境:XP、512M內(nèi)存、Eclipse3.2下,JDK6.0,沒(méi)有加啟動(dòng)參數(shù),默認(rèn)最大內(nèi)存好像是64M。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題)[未登錄](méi) 2007-02-12 06:00 dreamstone

          郁悶了,我的兩臺(tái)電腦,測(cè)試的結(jié)果都是穩(wěn)定的差不到1秒
          xp sp2 eclipse3.2.1 jdk1.5 啟動(dòng)參數(shù)也沒(méi)加,最大內(nèi)存開(kāi)始是512,后來(lái)改成256和64都試了。
          結(jié)果test1:2938 2953 2954 2954 2969
          test2:3797 3797 3781 4000 3797 3797
          我今天再找別人試一下,看看什么情況。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題)[未登錄](méi) 2007-02-12 09:56 dreamstone

          又找了幾個(gè)同事幫忙測(cè)試了一下,果然,有的差距是100毫秒,有的200,有的基本沒(méi)差距。我公司的電腦差距是200,也就是說(shuō)我家里的測(cè)試不準(zhǔn)確,真實(shí)不可思議,我在家測(cè)了很多次,都穩(wěn)定在差距1000毫秒,呵呵。不過(guò)問(wèn)題總算解決了。
          另外經(jīng)過(guò)測(cè)試發(fā)現(xiàn)在這個(gè)問(wèn)題上,amd的cpu比intel的快,單核的比雙核的快。。有意思。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) (問(wèn)題結(jié)束)[未登錄](méi) 2007-02-12 18:13 JIm

          注意jdk版本,一些基本的東西隨著JDK不斷的更新,都會(huì)有改變。對(duì)JAVA沒(méi)什么好印象!??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) (問(wèn)題結(jié)束) 2007-02-12 19:15 dreamstone

          有些是跟版本有關(guān)的,這個(gè)跟版本沒(méi)關(guān)系,呵呵。
          為什么對(duì)java印象不好呢,每個(gè)語(yǔ)言都有它的好處和壞處。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) (問(wèn)題結(jié)束) 2007-02-12 20:10 dreamstone

          剛才又做了個(gè)測(cè)試,一個(gè)很有意思的結(jié)果:使用ibm的ibm_sdk50測(cè)試結(jié)果剛好相反,執(zhí)行10億次,方法二比方法一快了200毫秒。挺有意思。

          不過(guò)結(jié)論是一樣的,就是兩種方法性能差別很小,但方法二讓對(duì)象的有效期變長(zhǎng)了,如果是大對(duì)象(例如圖形對(duì)象,數(shù)據(jù)bean對(duì)象)則不好,所以一般情況下應(yīng)選擇方法一的寫(xiě)法?;蛘叻椒ǘ膶?xiě)法加上手動(dòng)清空釋放對(duì)象。??回復(fù)??更多評(píng)論??

          #?re: 開(kāi)啟一個(gè)新的問(wèn)題(關(guān)于聲明變量的性能問(wèn)題) (問(wèn)題結(jié)束)2007-02-13 09:02 Welkin Hu

          牛啊!
          俺可很少關(guān)注到這一層。俺通常來(lái)說(shuō)會(huì)用第一種的??梢允∠掳?300ms寫(xiě)代碼的時(shí)間。??回復(fù)??更多評(píng)論??

          posted on 2007-02-26 09:21 liaojiyong 閱讀(537) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java

          主站蜘蛛池模板: 罗田县| 固安县| 灵台县| 德安县| 苏尼特右旗| 通化县| 界首市| 洛隆县| 阳信县| 葵青区| 邛崃市| 米林县| 隆子县| 米脂县| 成安县| 通榆县| 邹城市| 白银市| 昌图县| 凤台县| 辽源市| 北京市| 梁河县| 南陵县| 伽师县| 大姚县| 彝良县| 双辽市| 都匀市| 平陆县| 济阳县| 雅安市| 岢岚县| 靖边县| 湖口县| 波密县| 甘德县| 阳曲县| 大石桥市| 吉安市| 邵阳县|