成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

優化Java中的多態代碼 走進新版OpenJDK

開發 后端
Oracle的Java是一個門快速的語言,有時候它可以和C++一樣快。編寫Java代碼時,我們通常使用接口、繼承或者包裝類(wrapper class)來實現多態,使軟件更加靈活。不幸的是,多態會引入更多的調用,讓Java的性能變得糟糕。部分問題是,Java不建議使用完全的內聯代碼,即使它是非常安全的。(這個問題可能會在最新的Java版本里得到緩解,請看文章后面的更新部分)

優化Java中的多態代碼

Oracle的Java是一個門快速的語言,有時候它可以和C++一樣快。編寫Java代碼時,我們通常使用接口、繼承或者包裝類(wrapper class)來實現多態,使軟件更加靈活。不幸的是,多態會引入更多的調用,讓Java的性能變得糟糕。部分問題是,Java不建議使用完全的內聯代碼,即使它是非常安全的。(這個問題可能會在***的Java版本里得到緩解,請看文章后面的更新部分)

考慮下這種情況,我們要用接口抽象出一個整型數組:

  1. public interface Array { 
  2.     public int get(int i); 
  3.     public void set(int i, int x); 
  4.     public int size(); 

你為什么要這樣做?可能是因為你的數據是保存在數據庫里、網絡上、磁盤上或者在其他的數據結構里。你想一次編碼后就不用關心數組的具體實現。

編寫一個與標準Java數組一樣高效率的類并不難,不同之處在于它實現了這個接口:

  1. public final class NaiveArray implements Array { 
  2.     protected int[] array; 
  3.   
  4.     public NaiveArray(int cap) { 
  5.         array = new int[cap]; 
  6.     } 
  7.   
  8.     public int get(int i) { 
  9.         return array[i]; 
  10.     } 
  11.   
  12.     public void set(int i, int x) { 
  13.         array[i] = x;  
  14.     } 
  15.   
  16.     public int size() { 
  17.         return array.length; 
  18.     } 

至少在理論上,NaiveArray類不會出現任何的性能問題。這個類是final的,所有的方法都很簡短。

不幸的是,在一個簡單的benchmark類里,當使用NavieArray作為數組實例時,你會發現NavieArray比標準數組慢5倍以上。就像這個例子:

  1. public int compute() { 
  2.    for(int k = 0; k < array.size(); ++k) 
  3.       array.set(k,k); 
  4.    int sum = 0
  5.    for(int k = 0; k < array.size(); ++k) 
  6.       sum += array.get(k); 
  7.    return sum; 

你可以通過使用NavieArray作為NavieArray的一個實例來稍微減緩性能問題(避免使用多態)。不幸的是,它依然會慢3倍多。而你僅是放棄了多態的好處。

那么,強制使用內聯函數調用會怎樣?

一個可行的解決方法是手動實現內聯函數。你可以使用 instanceof 關鍵字來提供優化實現,否則你只會得到一個普通(更慢)的實現。例如,如果你使用下面的代碼,NavieArray就會變得和標準數組一樣快:

  1. public int compute() { 
  2.      if(array instanceof NaiveArray) { 
  3.         int[] back = ((NaiveArray) array).array; 
  4.         for(int k = 0; k < back.length; ++k) 
  5.            back[k] = k; 
  6.         int sum = 0
  7.         for(int k = 0; k < back.length; ++k) 
  8.            sum += back[k]; 
  9.         return sum; 
  10.      } 
  11.      //... 

當然,我也會介紹一個維護問題作為需要實現不止一次的同類算法…… 當出現性能問題時,這是一個可接受的替代。

和往常一樣,我的benchmarking代碼可以在網上獲取到

總結

  • 一些Java版本可能不完全支持頻繁的內聯函數調用,即使它可以并且應該支持。這會造成嚴重的性能問題。
  • 把類聲明為 final 看起來不會緩解性能問題。
  • 對于消耗大的函數,可行的解決方法是自己手動優化多態和實現內聯函數調用。使用 instanceof 關鍵字,你可以為一些特定的類編寫代碼并且(因此)保留多態的靈活性。

更新

Erich Schubert使用 double 數組運行簡單的benchmark類發現他的運行結果與我的結果相矛盾,而且我們的變量實現都是一樣的。我通過更新到***版本的OpenJDK證明了他的結果。下面的表格給出了處理10百萬整數需要的納秒時間:

 Function  Oracle JDK 8u11  OpenJDK 1.8.0_40  OpenJDK 1.7.0_65
straight arrays 0.92 0.71 0.87
with interface 5.9 0.70 6.3
with manual inlining 0.98 0.71 0.93

正如我們看到的,***版本的OpenJDK十分智能,并且消除了多態的性能開銷(1.8.0_40)。如果你足夠幸運地在使用這個JDK,你不需要擔心這 篇文章所說的性能問題。但是,這個總體思想依然值得應用在更復雜的場景里。例如,JDK優化可能依然達不到你期待的性能要求。

原文鏈接: lemire 翻譯: ImportNew.com 進林

譯文鏈接: http://www.importnew.com/14393.html

責任編輯:張偉 來源: ImportNew
相關推薦

2009-05-14 14:46:33

SunJava 7模塊系統

2023-05-09 12:42:51

Java繼承多態

2014-09-28 10:26:06

OpenJDK

2010-10-17 14:30:20

業務分析與優化云計算物聯網

2010-09-14 09:30:04

Java多態

2023-10-27 08:49:00

JCovOpenJDK

2009-06-17 13:26:06

scala繼承模型

2025-05-22 08:21:28

2013-05-28 14:34:40

Java優化代碼優化

2010-02-03 14:42:48

Fedora Open

2009-07-06 17:21:36

.NET中的多態

2023-11-28 18:09:49

Java多態

2011-09-13 09:56:42

Java

2023-10-20 11:24:25

JMH基準測試

2018-04-08 15:40:09

Java代碼優化

2021-06-27 06:25:14

代碼優化技巧Java

2009-10-14 11:14:38

ScitterScalaTwitter

2020-08-11 09:47:30

JS閉包代碼

2011-07-13 09:46:23

javaScript

2020-06-24 12:01:16

Python數據類字符
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天综合网永久 | 欧美老少妇一级特黄一片 | 国产欧美在线一区 | a视频在线观看 | 97伊人| 精品视频在线播放 | 日韩精品一区中文字幕 | 精品福利在线 | www.狠狠干 | 国产视频福利一区 | 国产一区二区精品在线 | 久草在线 | 国产乱码精品一品二品 | 中文在线一区二区 | 精品欧美乱码久久久久久1区2区 | 国产精品久久午夜夜伦鲁鲁 | 日韩一区二区在线播放 | 成人在线视频一区 | 亚州无限乱码 | 另类专区成人 | 亚洲国产成人精品久久 | 日韩一区二区三区视频 | 成人免费视频网站在线观看 | 国产成人一区二区三区电影 | 久久色视频 | 狠狠伊人 | 亚洲精品国产电影 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 久久精品欧美一区二区三区不卡 | 国产三级一区二区 | 国产精品久久久久aaaa九色 | 久久国产综合 | 日韩欧美在线播放 | 特级特黄特色的免费大片 | 亚洲一区二区三区免费视频 | 欧美国产日韩在线 | www亚洲成人 | 91在线影院 | 亚洲国产一区二区三区在线观看 | 免费在线观看成人 | 在线观看三级av |