精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 自動裝箱性能

開發 后端
為了查看代碼熱路徑(hot path)上的結果,JMH集成了Linux工具perf,可以查看最熱代碼塊的JIT編譯結果。(要想查看匯編代碼,需要安裝hsdis插件。我在 AUR上提供了下載,Arch用戶可以直接獲取。)在JMH命令行添加 -prof perfasm 命令,就可以看到結果:

Java 的基本數據類型(int、double、 char)都不是對象。但由于很多Java代碼需要處理的是對象(Object),Java給所有基本類型提供了包裝類(Integer、Double、Character)。有了自動裝箱,你可以寫如下的代碼

[[150602]]

  1. Character boxed = 'a'
  2. char unboxed = boxed; 

編譯器自動將它轉換為

 

  1. Character boxed = Character.valueOf('a'); 
  2. char unboxed = boxed.charValue(); 

然而,Java虛擬機不是每次都能理解這類過程,因此要想得到好的系統性能,避免不必要的裝箱很關鍵。這也是 OptionalInt 和 IntStream 等特殊類型存在的原因。在這篇文章中,我將概述JVM很難消除自動裝箱的一個原因。

實例

例如,我們想要計算任意一類數據的編輯距離(Levenshtein距離),只要這些數據可以被看作一個序列:

 

  1. public class Levenshtein{ 
  2. private final Function> asList; 
  3.  
  4. public Levenshtein(Function> asList) { 
  5. this.asList = asList; 
  6.  
  7. public int distance(T a, T b) { 
  8. // Wagner-Fischer algorithm, with two active rows 
  9.  
  10. List aList = asList.apply(a); 
  11. List bList = asList.apply(b); 
  12.  
  13. int bSize = bList.size(); 
  14. int[] row0 = new int[bSize + 1]; 
  15. int[] row1 = new int[bSize + 1]; 
  16.  
  17. for (int i = 0; i row0[i] = i; 
  18.  
  19. for (int i = 0; i < bSize; ++i) { 
  20. U ua = aList.get(i); 
  21. row1[0] = row0[0] + 1
  22.  
  23. for (int j = 0; j < bSize; ++j) { 
  24. U ub = bList.get(j); 
  25. int subCost = row0[j] + (ua.equals(ub) ? 0 : 1); 
  26. int delCost = row0[j + 1] + 1
  27. int insCost = row1[j] + 1
  28. row1[j + 1] = Math.min(subCost, Math.min(delCost, insCost)); 
  29.  
  30. int[] temp = row0; 
  31. row0 = row1; 
  32. row1 = temp; 
  33.  
  34. return row0[bSize]; 

只要兩個對象可以被看作List,這個類就可以計算它們的編輯距離。如果想計算String類型的距離,那么就需要把String轉變為List類型:

 

  1. public class StringAsList extends AbstractList{ 
  2. private final String str; 
  3.  
  4. public StringAsList(String str) { 
  5. this.str = str; 
  6.  
  7. @Override 
  8. public Character get(int index) { 
  9. return str.charAt(index); // Autoboxing! } 
  10.  
  11. @Override 
  12. public int size() { 
  13. return str.length(); 
  14.  
  15. ... 
  16.  
  17. Levenshteinlev = new Levenshtein<>(StringAsList::new); 
  18. lev.distance("autoboxing is fast""autoboxing is slow"); // 4 

由于Java泛型的實現方式,不能有List類型,所以要提供List和裝箱操作。(注:Java10中,這個限制也許會被取消。)

為了查看代碼熱路徑(hot path)上的結果,JMH集成了Linux工具perf,可以查看最熱代碼塊的JIT編譯結果。(要想查看匯編代碼,需要安裝hsdis插件。我在 AUR上提供了下載,Arch用戶可以直接獲取。)在JMH命令行添加 -prof perfasm 命令,就可以看到結果:

為了測試 distance() 方法的性能,需要做基準測試。Java中微基準測試很難保證準確,但幸好OpenJDK提供了JMH(Java Microbenchmark Harness),它可以幫我們解決大部分難題。如果感興趣的話,推薦大家閱讀文檔和實例;它會很吸引你。以下是基準測試:

 

  1. @State(Scope.Benchmark) 
  2. public class MyBenchmark { 
  3. private Levenshtein lev = new Levenshtein<>(StringAsList::new); 
  4.  
  5. @Benchmark 
  6. @BenchmarkMode(Mode.AverageTime) 
  7. @OutputTimeUnit(TimeUnit.NANOSECONDS) 
  8. public int timeLevenshtein() { 
  9. return lev.distance("autoboxing is fast""autoboxing is slow"); 

(返回方法的結果,這樣JMH就可以做一些操作讓系統認為返回值會被使用到,防止冗余代碼消除影響了結果。)

以下是結果:

  1. $ java -jar target/benchmarks.jar -f 1 -wi 8 -i 8 
  2. # JMH 1.10.2 (released 3 days ago) 
  3. # VM invoker: /usr/lib/jvm/java-8-openjdk/jre/bin/java 
  4. # VM options: 
  5. # Warmup: 8 iterations, 1 s each 
  6. # Measurement: 8 iterations, 1 s each 
  7. # Timeout: 10 min per iteration 
  8. # Threads: 1 thread, will synchronize iterations 
  9. # Benchmark mode: Average time, time/op 
  10. # Benchmark: com.tavianator.boxperf.MyBenchmark.timeLevenshtein 
  11.  
  12. # Run progress: 0.00% complete, ETA 00:00:16 
  13. # Fork: 1 of 1 
  14. # Warmup Iteration 11517.495 ns/op 
  15. # Warmup Iteration 21503.096 ns/op 
  16. # Warmup Iteration 31402.069 ns/op 
  17. # Warmup Iteration 41480.584 ns/op 
  18. # Warmup Iteration 51385.345 ns/op 
  19. # Warmup Iteration 61474.657 ns/op 
  20. # Warmup Iteration 71436.749 ns/op 
  21. # Warmup Iteration 81463.526 ns/op 
  22. Iteration 11446.033 ns/op 
  23. Iteration 21420.199 ns/op 
  24. Iteration 31383.017 ns/op 
  25. Iteration 41443.775 ns/op 
  26. Iteration 51393.142 ns/op 
  27. Iteration 61393.313 ns/op 
  28. Iteration 71459.974 ns/op 
  29. Iteration 81456.233 ns/op 
  30.  
  31. Result "timeLevenshtein"
  32. 1424.461 ±(99.9%) 59.574 ns/op [Average] 
  33. (min, avg, max) = (1383.0171424.4611459.974), stdev = 31.158 
  34. CI (99.9%): [1364.8871484.034] (assumes normal distribution) 
  35.  
  36. # Run complete. Total time: 00:00:16 
  37.  
  38. Benchmark Mode Cnt Score Error Units 
  39. MyBenchmark.timeLevenshtein avgt 8 1424.461 ± 59.574 ns/op 

分析

為了查看代碼熱路徑(hot path)上的結果,JMH集成了Linux工具perf,可以查看最熱代碼塊的JIT編譯結果。(要想查看匯編代碼,需要安裝hsdis插件。我在 AUR上提供了下載,Arch用戶可以直接獲取。)在JMH命令行添加 -prof perfasm 命令,就可以看到結果:

  1. $ java -jar target/benchmarks.jar -f 1 -wi 8 -i 8 -prof perfasm 
  2. ... 
  3. cmp $0x7f,%eax 
  4. jg 0x00007fde989a6148 ;*if_icmpgt 
  5. ; - java.lang.Character::valueOf@3 (line 4570
  6. ; - com.tavianator.boxperf.StringAsList::get@8 (line 14
  7. ; - com.tavianator.boxperf.StringAsList::get@2; (line 5
  8. ; - com.tavianator.boxperf.Levenshtein::distance@121 (line 32
  9. cmp $0x80,%eax 
  10. jae 0x00007fde989a6103 ;*aaload 
  11. ; - java.lang.Character::valueOf @ 10 (line 4571
  12. ; - com.tavianator.boxperf.StringAsList::get@8 (line 14
  13. ; - com.tavianator.boxperf.StringAsList::get @ 2 (line 5
  14. ; - com.tavianator.boxperf.Levenshtein::distance@121 (line 32
  15. ... 

輸出內容很多,但上面的一點內容就說明裝箱沒有被優化。為什么要和0x7f/0×80的內容做比較呢?原因在于Character.valueOf()的取值來源:

 

  1. private static class CharacterCache { 
  2. private CharacterCache(){} 
  3.  
  4. static final Character cache[] = new Character[127 + 1]; 
  5.  
  6. static { 
  7. for (int i = 0; i < cache.length; i++) 
  8. cache[i] = new Character((char)i); 
  9.  
  10. public static Character valueOf(char c) { 
  11. if (c return CharacterCache.cache[(int)c]; 
  12. return new Character(c); 

可以看出,Java語法標準規定前127個char的Character對象放在緩沖池中,Character.valueOf()的結果在其中 時,直接返回緩沖池的對象。這樣做的目的是減少內存分配和垃圾回收,但在我看來這是過早的優化。而且它妨礙了其他優化。JVM無法確定 Character.valueOf(c).charValue() == c,因為它不知道緩沖池的內容。所以JVM從緩沖池中取了一個Character對象并讀取它的值,結果得到的就是和 c 一樣的內容。

解決方法

解決方法很簡單:

  1. @ @ -11,7 +11,7 @ @ public class StringAsList extends AbstractList { 
  2.  
  3. @Override 
  4. public Character get(int index) { 
  5. return str.charAt(index); // Autoboxing! 
  6. return new Character(str.charAt(index)); 

@Override

用顯式的裝箱代替自動裝箱,就避免了調用Character.valueOf(),這樣JVM就很容易理解代碼:

  1. private final char value; 
  2.  
  3. public Character(char value) { 
  4. this.value = value; 
  5.  
  6. public char charValue() { 
  7. return value; 

雖然代碼中加了一個內存分配,但JVM能理解代碼的意義,會直接從String中獲取char字符。性能提升很明顯:

 

  1. $ java -jar target/benchmarks.jar -f 1 -wi 8 -i 8 
  2. ... 
  3. # Run complete. Total time: 00:00:16 
  4.  
  5. Benchmark Mode Cnt Score Error Units 
  6. MyBenchmark.timeLevenshtein avgt 8 1221.151 ± 58.878 ns/op 

速度提升了14%。用 -prof perfasm 命令可以顯示,改進以后是直接從String中拿到char值并在寄存器中比較的:

movzwl 0x10(%rsi,%rdx,2),%r11d ;*caload
; - java.lang.String::charAt@27 (line 648)
; - com.tavianator.boxperf.StringAsList::get@9 (line 14)
; - com.tavianator.boxperf.StringAsList::get @ 2 (line 5)
; - com.tavianator.boxperf.Levenshtein::distance@121 (line 32)
cmp %r11d,%r10d
je 0x00007faa8d404792 ;*if_icmpne
; - java.lang.Character::equals@18 (line 4621)
; - com.tavianator.boxperf.Levenshtein::distance@137 (line 33)

總結

裝箱是HotSpot的一個弱項,希望它能做到越來越好。它應該多利用裝箱類型的語義,消除裝箱操作,這樣以上的解決辦法就沒有必要了。

以上的基準測試代碼都可以在GitHub上訪問。

責任編輯:王雪燕 來源: ImportNew
相關推薦

2012-03-26 11:32:45

Java

2015-09-02 10:12:54

Java自動裝箱拆箱

2018-09-05 15:51:25

Java自動拆裝箱

2009-06-08 22:03:37

裝箱問題Java

2020-11-02 13:06:42

Java裝箱拆箱

2009-08-26 03:39:00

C#裝箱和拆箱

2013-12-06 14:52:49

性能評價模型分析WEB系統

2021-01-24 11:46:26

自動化Web 優化

2020-03-27 20:22:53

數據集裝箱網絡

2009-08-28 11:22:11

C#裝箱和拆箱

2012-05-11 10:11:55

Java游戲維護

2019-10-30 16:03:48

JavaJava虛擬機數據庫

2011-12-15 09:55:47

javanio

2015-06-10 14:07:27

數據中心

2021-09-06 14:30:34

C#裝箱拆箱

2015-06-04 09:59:01

數據中心集裝箱

2011-11-28 11:04:53

數據中心云立方云計算

2009-08-06 15:40:11

C#裝箱和拆箱

2024-09-06 07:55:42

2022-03-03 11:26:14

自動駕駛開發性能
點贊
收藏

51CTO技術棧公眾號

偷拍亚洲欧洲综合| 久久se精品一区二区| 午夜免费视频在线国产| 日韩精品福利网| 亚洲天堂成人在线视频| 91日韩精品视频| av资源在线| 国产精品婷婷午夜在线观看| 亚洲自拍偷拍网址| 91精品国产综合久久久蜜臀九色| 欧美岛国激情| 亚洲精品videossex少妇| 国产精品亚洲a| 手机av免费在线| 国产欧美一区二区在线| 高清不卡日本v二区在线| 尤物视频免费观看| 在线观看视频日韩| 最近2019年日本中文免费字幕| 中文字幕99页| 色婷婷成人网| 色婷婷精品大视频在线蜜桃视频 | 国产亚洲欧美日韩在线观看一区二区| 欧美福利视频导航| 成人在线观看黄| 久久www人成免费看片中文| 日本一区二区在线不卡| 国产伦精品一区二区三区四区视频 | aaaaaa毛片| 91精品国产自产在线观看永久∴ | 成人在线高清视频| 欧洲亚洲视频| 欧美日韩一区三区四区| 国产精品宾馆在线精品酒店| av在线网址观看| 国产三级欧美三级日产三级99| 成人午夜电影在线播放| 一本大道伊人av久久综合| 国产一区二区三区久久| 久久久久久久久爱| 欧美日韩在线观看成人| 欧美xxav| 中文字幕日韩精品在线| 老熟妇一区二区| 亚洲婷婷影院| 日韩精品小视频| 黄色污在线观看| 成人在线视频你懂的| 亚洲一二三区视频在线观看| 在线观看欧美一区| 午夜在线视频播放| 久久久不卡网国产精品一区| 久久精品国产综合精品| 丰满少妇在线观看bd| 成人自拍视频在线| 国产精品一区二区欧美黑人喷潮水| 97人妻精品一区二区三区视频 | 日韩av电影免费观看高清| 日韩成人免费观看| 亚洲一区二区毛片| 日本一本a高清免费不卡| 亚洲日本视频在线观看| 乱码第一页成人| 国产97在线亚洲| 中日韩av在线| 精品中文av资源站在线观看| 91久久夜色精品国产网站| 国产女人18毛片水真多| 国产成人精品网址| 国产综合精品一区二区三区| 国产熟妇一区二区三区四区| 国产精品普通话对白| 91av视频在线| 日本美女黄色一级片| 欧美mv日韩| 欧美久久精品午夜青青大伊人| 欧美 日韩 国产 一区二区三区| 欧美成人首页| 538国产精品视频一区二区| 日本视频在线观看免费| www.国产毛片| 亚洲人成网亚洲欧洲无码| 精品无人区乱码1区2区3区在线| 魔女鞋交玉足榨精调教| 成人无号精品一区二区三区| 久热在线中文字幕色999舞| 国产一级在线播放| 久久婷婷久久| 亚洲a中文字幕| 天堂在线资源网| 欧美国产在线观看| 男人草女人视频| 午夜久久中文| 欧美老年两性高潮| 91精品小视频| 欧美mv日韩| 韩国三级日本三级少妇99| 波多野结衣一区二区三区四区| 麻豆高清免费国产一区| 风间由美一区二区三区| 国产三区四区在线观看| 一区二区三区成人| 免费日韩中文字幕| 久久99成人| 亚洲系列中文字幕| 欧美日韩精品在线观看视频| 噜噜噜躁狠狠躁狠狠精品视频| 成人福利网站在线观看11| 狠狠躁夜夜躁av无码中文幕| 国产精品天干天干在线综合| 欧美中文字幕在线观看视频| 高清电影一区| 精品国产精品一区二区夜夜嗨| 小早川怜子久久精品中文字幕| 欧美日韩99| 国产女精品视频网站免费| www.香蕉视频| 日韩毛片一区| 99免费精品视频| 99re99热| 91九色综合| 日韩成人黄色av| 中文字幕五月天| 日本免费新一区视频| 国产一区二区三区色淫影院| 免费大片黄在线| 一本色道亚洲精品aⅴ| 好吊操视频这里只有精品| 欧美综合一区| 国产福利视频一区| 午夜激情在线视频| 亚洲午夜久久久久久久久电影网| 午夜av中文字幕| 欧美日韩一二| 国产精品av网站| 日韩福利一区二区| 欧美日韩国产精品一区| 成人区人妻精品一区二| 欧美日韩免费观看一区=区三区| 国产精品视频午夜| 国产福利在线视频| 91久久久免费一区二区| 日本一区二区三区网站| 在线亚洲观看| 精品一区二区久久久久久久网站| 免费看电影在线| 欧美成人vr18sexvr| 精品视频久久久久| 高清不卡一区二区在线| 青青青青在线视频| 99精品在免费线中文字幕网站一区| 久久综合网hezyo| 国产人妖一区二区| 亚洲欧美日韩在线| 日本黄色一级网站| 国模 一区 二区 三区| 91入口在线观看| 亚洲性图自拍| 精品成人佐山爱一区二区| 国产福利久久久| av中文字幕不卡| 国产精品国产三级国产aⅴ原创 | 特大黑人巨人吊xxxx| 一区二区精品| 欧美区高清在线| 成人网ww555视频免费看| 少妇久久久久久| 国产精品视频第一页| 亚洲精品欧美激情| 少妇被狂c下部羞羞漫画| 亚洲一区免费| 亚洲ai欧洲av| 精品国产亚洲一区二区三区在线 | 欧美精品一区二| av黄色在线看| 国产精品污网站| 精产国品一区二区三区| 一本色道久久综合亚洲精品不| 日本一区二区三区免费看| 亚洲黑人在线| 久久久久久久成人| 春暖花开成人亚洲区| 欧美一区二区三区喷汁尤物| 国产大片aaa| 国产欧美日韩在线视频| 少妇欧美激情一区二区三区| 国产日韩欧美| 影音先锋欧美资源| 加勒比色老久久爱综合网| 国产精品精品国产| 黄视频在线免费看| 一区二区成人精品| 性一交一乱一伧老太| 欧美性生交xxxxxdddd| 国精品人伦一区二区三区蜜桃| 国产69精品久久99不卡| 国产精品无码av无码| 欧美成人69| 欧洲久久久久久| 欧美激情三级| 国产精品777| 校园春色 亚洲| 91在线三级| 欧美va天堂va视频va在线| 日本视频免费观看| 亚洲最新在线观看| 超薄肉色丝袜一二三| 成人自拍视频在线| 日本一二区免费| 亚洲专区一区二区三区| 特级西西人体www高清大胆| 视频一区在线观看| 国产综合第一页| 天堂精品在线视频| 国产在线视频欧美| 日韩毛片免费观看| 久久久久亚洲精品| 麻豆网站在线观看| 国产一区二区三区在线播放免费观看| 亚洲第一视频在线| 9191国产精品| 伊人久久亚洲综合| 91极品视觉盛宴| 日本道在线观看| 洋洋av久久久久久久一区| 日本午夜在线观看| 国产精品久久久久天堂| 玖玖爱在线观看| 97国产一区二区| 极品白嫩的小少妇| 国产成人亚洲精品青草天美 | 亚洲一区资源| 97免费在线视频| 99热99re6国产在线播放| 欧美高清无遮挡| 性欧美videoshd高清| 米奇精品一区二区三区在线观看| 91精品国产综合久久久久久豆腐| 亚洲色图日韩av| 黄色电影免费在线看| 国产婷婷成人久久av免费高清| 欧美熟妇交换久久久久久分类| 欧美变态tickle挠乳网站| www.av网站| 精品国产99国产精品| 蜜桃91麻豆精品一二三区| 日韩视频123| 亚洲AV无码一区二区三区性| 精品区一区二区| 黑人乱码一区二区三区av| 精品国产99国产精品| 色偷偷在线观看| 精品视频在线观看日韩| 欧美高清成人| 国产亚洲精品一区二555| 成人欧美亚洲| 最近2019年中文视频免费在线观看| 日本www在线观看| 久久九九国产精品怡红院| av观看在线| 久久免费高清视频| 亚洲精品**中文毛片| 日韩av手机在线观看| 成人激情视屏| 91免费看国产| 91综合久久爱com| 国产精品久久久久久久天堂第1集| 成午夜精品一区二区三区软件| 国产精品一区免费观看| 久久夜色精品国产噜噜av小说| 久久影院理伦片| 欧美一区二区性| 狠狠干视频网站| 亚洲激情精品| 亚洲少妇第一页| 国内一区二区视频| 波多野结衣加勒比| 国产亚洲精品资源在线26u| 国产三级精品三级观看| 亚洲综合清纯丝袜自拍| 欧美性猛交bbbbb精品| 欧美精品在线视频| 日本成人动漫在线观看| 国产午夜精品全部视频在线播放| 欧美成人二区| 91av国产在线| 超碰国产精品一区二页| 精品视频免费观看| 久久在线视频| 久久人人爽人人爽人人av| 日韩av一区二区三区| 9191在线视频| 国产人久久人人人人爽| 九九视频在线观看| 欧洲精品中文字幕| 农村少妇久久久久久久| 深夜福利一区二区| 欧美激情网站| 91影院在线免费观看视频| 亚洲精华一区二区三区| av电影一区二区三区| 美女久久网站| 亚洲一级Av无码毛片久久精品| 日本一区二区久久| 日本免费观看视| 制服.丝袜.亚洲.中文.综合| 日韩a在线看| 久操成人在线视频| 国产91亚洲精品久久久| 久久精品久久精品国产大片| 亚洲一区欧美| 91高清国产视频| 久久男人中文字幕资源站| 精品无码一区二区三区电影桃花| 欧美视频第二页| 欧美男男激情freegay| 欧美成人免费大片| 中文成人在线| 台湾成人av| 石原莉奈在线亚洲三区| 日本一区二区在线免费观看| 亚洲蜜臀av乱码久久精品| 国产偷人爽久久久久久老妇app| 日韩黄在线观看| 丁香花在线观看完整版电影| 7777奇米亚洲综合久久| 色呦哟—国产精品| 另类小说第一页| xfplay精品久久| 亚洲精品1区2区3区| 亚洲精品一区二区三区精华液| 国产激情在线观看| 国产中文欧美精品| 欧美大人香蕉在线| 中文字幕第17页| 欧美国产在线观看| 中文字幕男人天堂| 国产一区二区三区免费视频| 在线观看欧美日韩电影| 久久亚洲综合网| 亚洲中字黄色| 国产高清自拍视频| 欧美午夜xxx| 色就是色亚洲色图| 欧美综合第一页| 免费视频一区三区| 国产一级特黄a大片免费| 欧美国产激情二区三区| 亚洲无码久久久久| 日韩网站在线观看| 国产精品99久久免费| 毛片在线视频观看| 成人一级片在线观看| 久久国产视频播放| 亚洲一区二区福利| 国产麻豆一区| 欧美三级午夜理伦三级老人| 国产精品资源在线| 日本一本高清视频| 亚洲女人天堂色在线7777| 日本成人片在线| 一区二区精品在线| 国产高清视频一区| 黄色小视频在线免费看| 精品偷拍各种wc美女嘘嘘| 色8久久影院午夜场| 一区二区日本伦理| 国产精品一二三四| 欧美h在线观看| 中文字幕免费精品一区| 国产麻豆一区二区三区| 欧美午夜性视频| 久久久精品欧美丰满| 97人妻人人澡人人爽人人精品| 色综合色综合网色综合| 自拍自偷一区二区三区| 2025韩国理伦片在线观看| 亚洲婷婷国产精品电影人久久| 国产91久久久| 国产精品久久91| 欧美精选一区| 毛茸茸多毛bbb毛多视频| 欧美女孩性生活视频| а√在线中文在线新版| 亚洲三区在线观看| 不卡电影一区二区三区| 中文字幕在线观看精品| 欧美精品福利在线| 国产九一精品| 老司机av网站| 欧美在线免费视屏| 大桥未久在线播放| 亚洲图片都市激情| 99久精品国产| 国产丰满美女做爰| 国产v综合ⅴ日韩v欧美大片| 女人天堂亚洲aⅴ在线观看| 中国黄色a级片| 日韩一区国产二区欧美三区| 欧美理论影院|