如何在Java中獲得類似于C的性能

總覽

Java有許多可能很慢的領域。 但是,對于每個問題都有解決方案。 許多解決方案/黑客都需要解決Java的保護問題,但是如果您需要低水平的性能,還是可以的。

Java使高級編程變得更簡單容易,但代價是使低級編程變得更加困難。 幸運的是,大多數應用程序都遵循經驗法則,即您將90%的時間花費在10%的代碼中。 這意味著您有90%的時間狀況良好,而有10%的時間狀況較差。 ;)

這讓我想知道為什么對于大多數項目,您會用C / C ++編寫超過10%的代碼。 在某些項目中,C / C ++是唯一明智的解決方案,但是我懷疑大多數C / C ++項目都可以通過使用Java之類的高級語言來提高生產力。

獲得類似C的性能的一種方法是通過JNI將C用于代碼的關鍵部分。 如果要避免使用C或JNI,仍然可以通過多種方法獲得所需的性能。

注意:這些建議大多數僅適用于獨立應用程序,而不適用于applet。

注意2:使用風險自負。 您可能需要測試使用低級Java時通常不需要擔心的極端情況。

快速陣列訪問

Java可能較慢的一個方面是數組訪問。 這是因為它隱式地進行邊界檢查。 JVM足夠聰明,可以通過檢查第一個和最后一個元素來優化循環檢查,但這并不總是適用。

一種解決方法是使用Unsafe類(該類僅在某些JVM上可用,而OpenJDK JVM才可用)。該類為每種基本類型都具有getXxxx()和setXxxx(),并允許您直接訪問對象,數組或直接內存,其中您必須進行邊界檢查。 在本機代碼中,這些被編譯為單個機器代碼指令。 還有一個getObject(),setObject()方法,但是我懷疑它們不能提供很多性能改進(在您訪問對象時也是如此)

您可以通過下載OpenJDK的調試版本并獲取其打印已編譯的本機代碼來檢查為方法生成的本機代碼。

任意內存訪問

您可以再次使用Unsafe類進行任意訪問,但是“更友好”的方法是使用DirectByteBuffer并根據需要更改其地址和限制(通過反射或通過JNI)。這將為您提供一個Buffer,它指向一個隨機區域。內存,例如設備緩沖區。

使用更少的內存

這已不再是一個問題。 一臺16 GB的服務器售價為1000美元,一臺1 TB的服務器售價約為7萬美元。

但是,緩存仍然是一種溢價,對于某些應用程序而言,它值得減少內存消耗。 一個簡單的事情是使用Trove ,它可以有效地支持集合中的原語。 如果數據表很大,則可以按列而不是按行存儲數據(如果有很多行數據和幾列數據)。 如果您要按字段掃描數據但不需要所有字段,則可以改善緩存行為。

您還可以使用直接存儲器按需要存儲數據。 這就是BigMemory庫所使用的。

基于流的IO速度很慢,NIO很難使用

如何利用您的兩全其美? 在NIO中使用阻塞IO(這是通道的默認設置)除非需要選擇器,否則不要使用選擇器。 在許多情況下,它們只會增加復雜性。 大多數系統可以有效處理1K-10K線程。 如果您需要更多的連接,請購買另一臺服務器,一臺便宜的服務器大約需要500美元。

快速高效的字符串

Java 6 update 21具有選項-XX:+ UseCompressedStrings,對于不需要16位字符的字符串,可以使用byte []代替char []。 對于許多應用程序,這可以節省內存,但速度較慢。 (5%-10%)

相反,您可以使用自己的Text類型來包裝byte [],或者從ByteBuffer,CharBuffer中獲取文本數據或使用Unsafe。

更快的啟動時間

當您加載許多腫的庫時,Java的啟動時間往往很慢。 如果這確實是一個問題,那么您加載較少的庫。 無論如何,將它們保持在最低水平是一個好習慣。 這樣做,您的啟動時間將為幾秒鐘(不及C快,但可能足夠快)

更少的GC暫停

大多數Java庫都是自由創建對象的,通常這不是問題。

但是,這并不意味著您不能預先分配對象,不能使用直接字節緩沖區和對象回收技術來最大程度地減少對象的創建。 通過增加Eden大小,您可以擁有很少使用GC的應用程序。 您甚至可以將其每天減少到一個GC(例如按計劃的通宵工作)

參考: 如何從Vanilla Java的 JCG合作伙伴 Peter Lawrey 獲得Java的C類性能 。

相關文章:
  • Java中的低GC:使用原語而不是包裝器
  • 每個程序員都應該知道的事情
  • 正確記錄應用程序的10個技巧
  • 軟件設計法則
  • Java最佳實踐系列
  • 生存在狂野西部開發過程中的9條提示

翻譯自: https://www.javacodegeeks.com/2011/07/how-to-get-c-like-performance-in-java.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STARTUPINFO結構

1.結構原型 typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD w…

Spring聲明式事務示例

事務是具有ACID (原子的,一致的,隔離的和持久的)屬性的工作單元。 原子意味著所有更改都發生或什么都沒有發生。 如果從一個帳戶借錢并貸記到另一個帳戶,則交易將確保借記和貸項均已完成或均未完成。 一致表示更改使數…

路徑 (Path)–nodejs

本模塊包含一套用于處理和轉換文件路徑的工具集。幾乎所有的方法只做字符串變換, 不會調用文件系統檢查路徑是否有效。 通過 require(path) 來加載此模塊。以下是本模塊所提供的方法: path.normalize(p) 規范化字符串路徑,注意 .. 和 . 部分 …

OllyDBG反匯編快速找到程序入口一點分析

出處:http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先聲明下:這個和脫殼沒關系,不是找殼里面的程序入口哦,只是程序本身的入口,個別朋友不要誤會哈。其實這個應該是基礎,但我經常找…

簡單的Twitter:Heroku上的Play框架,AJAX,CRUD

因此,重大的公告發布了– Heroku開始為Play Framework應用程序提供本機支持! 如果您還沒有聽說過,請在Heroku的博客上查看Jesper Joergensen的帖子 。 因此,對于演示,我將建立一個非常基本的Twitter副本; 它…

Cron表達式

CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日歷的概念,而非SimpleTrigger完全指定的時間間隔,復發的發射工作的時間表。CronTrigger,你可以指定觸發的時間表如“每星期五中午”,或“每個工作日…

深入理解JavaScript學習筆記(3)_全面解析Module模式

簡介 Module模式是JavaScript編程中一個非常通用的模式,一般情況下,大家都知道基本用法,本文嘗試著給大家更多該模式的高級使用方式。 首先我們來看看Module模式的基本特征: 模塊化,可重用封裝了變量和function&#x…

匯編----乘指令: MUL、IMUL

MUL: 無符號乘 ;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX IMUL: 有符號乘 ;影響 OF、CF 標志位;…

Google App Engine Java功能和命名空間API

功能API 使用Capabilities API,您的應用程序可以檢測特定API功能的停機和計劃停機時間。 您可以使用此API來檢測應用程序何時不可用,然后繞過它來減少應用程序的停機時間。 我們該如何處理,這是個折衷方案? 1.優雅:創…

破解key file時經常用到的幾個API函數及其用法

CreateFile函數 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP計劃任務之關閉瀏覽器后仍然繼續執行的函數

函數名稱:ignore_user_abort 本函數配置或取得使用端連接中斷后,PHP 程序是否仍繼續執行。默認值為中斷連接后就停止執行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 選項就是配置處。本功能在 PHP 3.0.7 版之后才開始提供。 官方說明…

node--更新數據庫問題

昨天測試blog的comment功能,在新增comment相關的代碼之后,重啟應用,出現Cannot call method forEach of undefined 。反復核對代碼,都沒發現異常,最后將數據庫文件刪除之后,再重啟數據庫,一切正…

U盤做完啟動盤,如何恢復原始容量

(1)右擊“我的電腦”,選擇“管理”選項,之后選擇“磁盤管理”,查看自己U盤的索引,如:Disk 1(2)在運行窗口,輸入cmd,回車,出現Dos運行環…

GWT Spring和Hibernate進入數據網格世界

利用Infinispan數據網格的功能最大化Hibernate性能。 一個GWT , Spring , JPA , Hibernate , Infinispan集成教程。 在本教程中,我們將討論如何將Infinispan用作Hibernate二級緩存提供程序。 Infinispan是JBoss緩存的…

記對一個key file crackme的破解

crackme下載地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 遞歸 及 分組匯總 高級部分(多維數據集)

UNION 等集合操作符:UNION 等以第一個 SELECT 的 列明 作為 整個結果集的列明,整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY 這個意思是說 只有 ORDER BY 是對整個結果集作用的,其它都操作都作用在 UINON 兩側的 子集合中。EXCEPT 操…

Java Code Geeks Andygene Web原型

大家好, 我們很高興地宣布,一組Maven原型的第一個版本已經發布!!! 該集合的目的是提供可以滿足各種開發需求的項目模板。 您可以在本文末尾找到JCG路線圖。 該第一個發行版旨在提供項目模板-Web應用程序的體系結構。 …

關于如何用od反匯編win32 控制臺程序

*********************************************************** 如何用od反匯編win32 控制臺程序(類似dos程序)呢?*********************************************************** 注:od是用來調試win32程序的 1.反編譯win32 控制臺程序&…

Chrome/Chromium HTML5 video 視頻播放硬件加速

Chromium站點上有個大致的框圖。描寫敘述了Chromium的video在各個平臺 - 包含Android - 上是怎樣使用硬件資源來做視頻編解碼加速的: 而依據Android Kitkat上的Chromium代碼分析,HTML5 video播放硬件加速,終于是使用MediaCodec.java來利用本地…