日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

如何在Java中获得类似于C的性能

發(fā)布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在Java中获得类似于C的性能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

總覽

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

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

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

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

注意:這些建議大多數(shù)僅適用于獨立應(yīng)用程序,而不適用于applet。

注意2:使用風(fēng)險自負(fù)。 您可能需要測試使用低級Java時通常不需要擔(dān)心的極端情況。

快速陣列訪問

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

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

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

任意內(nèi)存訪問

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

使用更少的內(nèi)存

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

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

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

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

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

快速高效的字符串

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

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

更快的啟動時間

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

更少的GC暫停

大多數(shù)Java庫都是自由創(chuàng)建對象的,通常這不是問題。

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

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

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

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

總結(jié)

以上是生活随笔為你收集整理的如何在Java中获得类似于C的性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。