c#枚举类似于java_如何在Java中获得类似于C的性能
c#枚舉類似于java
總覽
Java有許多可能很慢的領(lǐng)域。 但是,對于每個(gè)問題都有解決方案。 許多解決方案/黑客都需要解決Java的保護(hù)問題,但是如果您需要低水平的性能,還是可以的。
Java使高級編程變得越來越容易,但代價(jià)是使低級編程變得更加困難。 幸運(yùn)的是,大多數(shù)應(yīng)用程序都遵循經(jīng)驗(yàn)法則,即您將90%的時(shí)間花費(fèi)在10%的代碼中。 這意味著您90%的時(shí)間狀況良好,10%的時(shí)間狀況較差。 ;)
這讓我想知道為什么對于大多數(shù)項(xiàng)目,您會(huì)用C / C ++編寫超過10%的代碼。 在某些項(xiàng)目中,C / C ++是唯一明智的解決方案,但是我懷疑大多數(shù)C / C ++項(xiàng)目將通過使用Java之類的高級語言來提高生產(chǎn)力。
獲得類似C的性能的一種方法是通過JNI將C用于代碼的關(guān)鍵部分。 如果要避免使用C或JNI,仍然可以通過多種方法獲得所需的性能。
注意:這些建議大多數(shù)僅適用于獨(dú)立應(yīng)用程序,而不適用于applet。
注2:使用風(fēng)險(xiǎn)自負(fù)。 您可能需要測試在使用低級Java時(shí)通常不需要擔(dān)心的極端情況。
快速陣列訪問
Java可能較慢的一個(gè)方面是數(shù)組訪問。 這是因?yàn)樗[式地進(jìn)行邊界檢查。 JVM足夠聰明,可以通過檢查第一個(gè)和最后一個(gè)元素來優(yōu)化對循環(huán)的檢查,但這并不總是適用。
一種解決方法是使用Unsafe類(僅在某些JVM上可用,而OpenJDK JVM才有),該類為每種基本類型都具有g(shù)etXxxx()和setXxxx(),并允許您直接訪問對象,數(shù)組或直接內(nèi)存,其中您必須進(jìn)行邊界檢查。 在本機(jī)代碼中,這些被編譯為單個(gè)機(jī)器代碼指令。 還有一個(gè)getObject(),setObject()方法,但是我懷疑它們不能提供很多性能改進(jìn)(在您訪問對象時(shí)也是如此)
您可以通過下載OpenJDK的調(diào)試版本并獲取其打印已編譯的本機(jī)代碼來檢查為方法生成的本機(jī)代碼。
任意內(nèi)存訪問
您可以再次使用Unsafe類進(jìn)行任意訪問,但是“更友好”的方法是使用DirectByteBuffer并根據(jù)需要更改其地址和限制(通過反射或通過JNI)。這將為您提供一個(gè)Buffer,它指向一個(gè)隨機(jī)區(qū)域。內(nèi)存,例如設(shè)備緩沖區(qū)。
使用更少的內(nèi)存
這已不再是一個(gè)大問題了。 一臺(tái)16 GB的服務(wù)器售價(jià)為1000美元,一臺(tái)1 TB的服務(wù)器售價(jià)約為7萬美元。
但是,緩存仍然是一種溢價(jià),對于某些應(yīng)用程序來說,它值得減少內(nèi)存消耗。 一個(gè)簡單的事情是使用Trove ,它可以有效地支持集合中的原語。 如果數(shù)據(jù)表很大,則可以按列而不是按行存儲(chǔ)數(shù)據(jù)(如果有很多行數(shù)據(jù)和幾列數(shù)據(jù))。 如果您要按字段掃描數(shù)據(jù)但不需要所有字段,則可以改善緩存行為。
您還可以使用直接內(nèi)存按需要存儲(chǔ)數(shù)據(jù)。 這就是BigMemory庫所使用的。
基于流的IO速度很慢,NIO很難使用
如何利用您的兩全其美? 在NIO中使用阻塞IO(這是通道的默認(rèn)設(shè)置)除非需要選擇器,否則不要使用選擇器。 在許多情況下,它們只會(huì)增加復(fù)雜性。 大多數(shù)系統(tǒng)可以有效處理1K-10K線程。 如果您需要更多的連接,請購買另一臺(tái)服務(wù)器,一臺(tái)便宜的服務(wù)器的價(jià)格約為500美元。
快速高效的字符串
Java 6 update 21具有選項(xiàng)-XX:+ UseCompressedStrings,對于不需要16位字符的字符串,可以使用byte []代替char []。 對于許多應(yīng)用程序,這可以節(jié)省內(nèi)存,但速度較慢。 (5%-10%)
相反,您可以使用自己的Text類型來包裝byte [],或者從ByteBuffer,CharBuffer中獲取文本數(shù)據(jù)或使用Unsafe。
更快的啟動(dòng)時(shí)間
當(dāng)您加載許多腫的庫時(shí),Java的啟動(dòng)時(shí)間往往很慢。 如果這確實(shí)是一個(gè)問題,那么您加載較少的庫。 無論如何,將它們保持在最低水平是一個(gè)好習(xí)慣。 這樣做,您的啟動(dòng)時(shí)間將為幾秒鐘(不及C快,但可能足夠快)
更少的GC暫停
大多數(shù)Java庫自由創(chuàng)建對象,通常這不是問題。
但是,這并不意味著您無法預(yù)先分配對象,不能使用直接字節(jié)緩沖區(qū)和對象回收技術(shù)來最大程度地減少對象的創(chuàng)建。 通過增加Eden大小,您可以擁有很少使用GC的應(yīng)用程序。 您甚至可以將其每天減少到一個(gè)GC(例如按計(jì)劃的通宵工作)
參考: 如何從Vanilla Java的 JCG合作伙伴 Peter Lawrey 獲得Java的C類性能 。
相關(guān)文章:- Java中的低GC:使用原語而不是包裝器
- 每個(gè)程序員都應(yīng)該知道的事情
- 正確記錄應(yīng)用程序的10個(gè)技巧
- 軟件設(shè)計(jì)法則
- Java最佳實(shí)踐系列
- 生存在荒野西部開發(fā)過程中的9條提示
翻譯自: https://www.javacodegeeks.com/2011/07/how-to-get-c-like-performance-in-java.html
c#枚舉類似于java
總結(jié)
以上是生活随笔為你收集整理的c#枚举类似于java_如何在Java中获得类似于C的性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wifi免费万能钥匙官网电脑版下载(万能
- 下一篇: c# char unsigned_dll