那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

看一下Java性能優(yōu)化都有哪些可以遵循的規(guī)律

Android編程精選 ? 來(lái)源:CSDN ? 作者:農(nóng)民工老王 ? 2022-10-09 16:10 ? 次閱讀

本文主要側(cè)重于理論分析,我們從整體上看一下 Java 性能優(yōu)化都有哪些可以遵循的規(guī)律。本文主講理論。關(guān)于實(shí)踐,后續(xù)的文章會(huì)用較多的案例來(lái)細(xì)化本文的知識(shí)點(diǎn),適合反復(fù)思考和歸納。

Part1概述

性能優(yōu)化根據(jù)優(yōu)化的類(lèi)別,分為業(yè)務(wù)優(yōu)化和技術(shù)優(yōu)化。業(yè)務(wù)優(yōu)化產(chǎn)生的效果也是非常大的,但它屬于產(chǎn)品和管理的范疇。同作為程序員,在平常工作中,我們面對(duì)的優(yōu)化方式,主要是通過(guò)一系列的技術(shù)手段,來(lái)完成對(duì)既定的優(yōu)化目標(biāo)。這一系列的技術(shù)手段,我大體歸納為如圖以下 7 類(lèi):

poYBAGNCgieAanFEAAB-mdCDfUU894.jpg
可以看到,優(yōu)化方式集中在對(duì)計(jì)算資源和存儲(chǔ)資源的規(guī)劃上。優(yōu)化方法中有多種用空間換時(shí)間的方式,但只照顧計(jì)算速度,而不考慮復(fù)雜性和空間問(wèn)題,也是不可取的。我們要做的,就是在照顧性能的前提下,達(dá)到資源利用的最優(yōu)狀態(tài)。

接下來(lái),我簡(jiǎn)要介紹一下這7個(gè)優(yōu)化方向。如果你感覺(jué)比較枯燥,那也沒(méi)關(guān)系,我們本文的目的,就是讓你的腦海里有一個(gè)總分的概念,以及對(duì)理論基礎(chǔ)有一個(gè)整體的認(rèn)識(shí)。

Part2復(fù)用優(yōu)化

在寫(xiě)代碼的時(shí)候,你會(huì)發(fā)現(xiàn)有很多重復(fù)的代碼可以提取出來(lái),做成公共的方法。這樣,在下次用的時(shí)候,就不用再費(fèi)勁寫(xiě)一遍了。

這種思想就是復(fù)用。上面的描述是編碼邏輯上的優(yōu)化,對(duì)于數(shù)據(jù)存取來(lái)說(shuō),有同樣的復(fù)用情況。無(wú)論是在生活中還是編碼中,重復(fù)的事情一直在發(fā)生,如果沒(méi)有復(fù)用,工作和生活就會(huì)比較累。

在軟件系統(tǒng)中,談到數(shù)據(jù)復(fù)用,我們首先想到的就是緩沖和緩存。注意這兩個(gè)詞的區(qū)別,它們的意義是完全不同的,很多同學(xué)很容易搞混,在這里簡(jiǎn)單地介紹一下。

緩沖(Buffer),常見(jiàn)于對(duì)數(shù)據(jù)的暫存,然后批量傳輸或者寫(xiě)入。多使用順序方式,用來(lái)緩解不同設(shè)備之間頻繁地、緩慢地隨機(jī)寫(xiě),緩沖主要針對(duì)的是寫(xiě)操作。

緩存(Cache),常見(jiàn)于對(duì)已讀取數(shù)據(jù)的復(fù)用,通過(guò)將它們緩存在相對(duì)高速的區(qū)域,緩存主要針對(duì)的是讀操作。

與之類(lèi)似的,是對(duì)于對(duì)象的池化操作,比如數(shù)據(jù)庫(kù)連接池、線程池等,在 Java 中使用得非常頻繁。由于這些對(duì)象的創(chuàng)建和銷(xiāo)毀成本都比較大,我們?cè)谑褂弥螅矔?huì)將這部分對(duì)象暫時(shí)存儲(chǔ),下次用的時(shí)候,就不用再走一遍耗時(shí)的初始化操作了。

Part3計(jì)算優(yōu)化

并行執(zhí)行

現(xiàn)在的 CPU 發(fā)展速度很快,絕大多數(shù)硬件,都是多核。要想加快某個(gè)任務(wù)的執(zhí)行,最快最優(yōu)的解決方式,就是讓它并行執(zhí)行。并行執(zhí)行有以下三種模式。

第一種模式是多機(jī),采用負(fù)載均衡的方式,將流量或者大的計(jì)算拆分成多個(gè)部分,同時(shí)進(jìn)行處理。比如,Hadoop 通過(guò) MapReduce 的方式,把任務(wù)打散,多機(jī)同時(shí)進(jìn)行計(jì)算。

第二種模式是采用多進(jìn)程。比如 Nginx,采用 NIO 編程模型,Master 統(tǒng)一管理 Worker 進(jìn)程,然后由 Worker 進(jìn)程進(jìn)行真正的請(qǐng)求代理,這也能很好地利用硬件的多個(gè) CPU。

第三種模式是使用多線程,這也是 Java 程序員接觸最多的。比如 Netty,采用 Reactor 編程模型,同樣使用 NIO,但它是基于線程的。Boss 線程用來(lái)接收請(qǐng)求,然后調(diào)度給相應(yīng)的 Worker 線程進(jìn)行真正的業(yè)務(wù)計(jì)算。

像 Golang 這樣的語(yǔ)言,有更加輕量級(jí)的協(xié)程(Coroutine),協(xié)程是一種比線程更加輕量級(jí)的存在,但目前在 Java 中還不太成熟,就不做過(guò)多介紹了,但本質(zhì)上,它也是對(duì)于多核的應(yīng)用,使得任務(wù)并行執(zhí)行。

變同步為異步

再一種對(duì)于計(jì)算的優(yōu)化,就是變同步為異步,這通常涉及編程模型的改變。同步方式,請(qǐng)求會(huì)一直阻塞,直到有成功,或者失敗結(jié)果的返回。雖然它的編程模型簡(jiǎn)單,但應(yīng)對(duì)突發(fā)的、時(shí)間段傾斜的流量,問(wèn)題就特別大,請(qǐng)求很容易失敗。

異步操作可以方便地支持橫向擴(kuò)容,也可以緩解瞬時(shí)壓力,使請(qǐng)求變得平滑。同步請(qǐng)求,就像拳頭打在鋼板上;異步請(qǐng)求,就像拳頭打在海綿上。你可以想象一下這個(gè)過(guò)程,后者肯定是富有彈性的,體驗(yàn)更加友好。

惰性加載

最后一種,就是使用一些常見(jiàn)的設(shè)計(jì)模式來(lái)優(yōu)化業(yè)務(wù),提高體驗(yàn),比如單例模式、代理模式等。舉個(gè)例子,在繪制 Swing 窗口的時(shí)候,如果要顯示比較多的圖片,就可以先加載一個(gè)占位符,然后通過(guò)后臺(tái)線程慢慢加載所需要的資源,這就可以避免窗口的僵死。

Part4結(jié)果集優(yōu)化

接下來(lái)介紹一下對(duì)結(jié)果集的優(yōu)化。舉個(gè)比較直觀的例子,我們都知道 XML 的表現(xiàn)形式是非常好的,那為什么還有 JSON 呢?除了書(shū)寫(xiě)要簡(jiǎn)單一些,一個(gè)重要的原因就是它的體積變小了,傳輸效率和解析效率變高了,像 Google 的 Protobuf,體積就更小了一些。雖然可讀性降低,但在一些高并發(fā)場(chǎng)景下(如 RPC),能夠顯著提高效率,這是典型的對(duì)結(jié)果集的優(yōu)化。

這是由于我們目前的 Web 服務(wù),都是 C/S 模式。數(shù)據(jù)從服務(wù)器傳輸?shù)娇蛻舳耍枰职l(fā)多份,這個(gè)數(shù)據(jù)量是急劇膨脹的,每減少一小部分存儲(chǔ),都會(huì)有比較大的傳輸性能和成本提升。

像 Nginx,一般都會(huì)開(kāi)啟 GZIP 壓縮,使得傳輸?shù)膬?nèi)容保持緊湊。客戶端只需要一小部分計(jì)算能力,就可以方便解壓。由于這個(gè)操作是分散的,所以性能損失是固定的。

了解了這個(gè)道理,我們就能看到對(duì)于結(jié)果集優(yōu)化的一般思路,你要盡量保持返回?cái)?shù)據(jù)的精簡(jiǎn)。一些客戶端不需要的字段,那就在代碼中,或者直接在 SQL 查詢(xún)中,就把它去掉。

歡迎關(guān)注公眾號(hào)"Java學(xué)習(xí)之道",查看更多干貨!

對(duì)于一些對(duì)時(shí)效性要求不高,但對(duì)處理能力有高要求的業(yè)務(wù)。我們要吸取緩沖區(qū)的經(jīng)驗(yàn),盡量減少網(wǎng)絡(luò)連接的交互,采用批量處理的方式,增加處理速度。

結(jié)果集合很可能會(huì)有二次使用,你可能會(huì)把它加入緩存中,但依然在速度上有所欠缺。這個(gè)時(shí)候,就需要對(duì)數(shù)據(jù)集合進(jìn)行處理優(yōu)化,采用索引或者 Bitmap 位圖等方式,加快數(shù)據(jù)訪問(wèn)速度。

Part5資源沖突優(yōu)化

我們?cè)谄匠5拈_(kāi)發(fā)中,會(huì)涉及很多共享資源。這些共享資源,有的是單機(jī)的,比如一個(gè) HashMap;有的是外部存儲(chǔ),比如一個(gè)數(shù)據(jù)庫(kù)行;有的是單個(gè)資源,比如 Redis 某個(gè) key 的Setnx;有的是多個(gè)資源的協(xié)調(diào),比如事務(wù)、分布式事務(wù)等。

現(xiàn)實(shí)中的性能問(wèn)題,和鎖相關(guān)的問(wèn)題是非常多的。大多數(shù)我們會(huì)想到數(shù)據(jù)庫(kù)的行鎖、表鎖、Java 中的各種鎖等。在更底層,比如 CPU 命令級(jí)別的鎖、JVM 指令級(jí)別的鎖、操作系統(tǒng)內(nèi)部鎖等,可以說(shuō)無(wú)處不在。

只有并發(fā),才能產(chǎn)生資源沖突。也就是在同一時(shí)刻,只能有一個(gè)處理請(qǐng)求能夠獲取到共享資源。解決資源沖突的方式,就是加鎖。再比如事務(wù),在本質(zhì)上也是一種鎖。

按照鎖級(jí)別,鎖可分為樂(lè)觀鎖和悲觀鎖,樂(lè)觀鎖在效率上肯定是更高一些;按照鎖類(lèi)型,鎖又分為公平鎖和非公平鎖,在對(duì)任務(wù)的調(diào)度上,有一些細(xì)微的差別。

對(duì)資源的爭(zhēng)用,會(huì)造成嚴(yán)重的性能問(wèn)題,所以會(huì)有一些針對(duì)無(wú)鎖隊(duì)列之類(lèi)的研究,對(duì)性能的提升也是巨大的。

Part6算法優(yōu)化

算法能夠顯著提高復(fù)雜業(yè)務(wù)的性能,但在實(shí)際的業(yè)務(wù)中,往往都是變種。由于存儲(chǔ)越來(lái)越便宜,在一些 CPU 非常緊張的業(yè)務(wù)中,往往采用空間換取時(shí)間的方式,來(lái)加快處理速度。

算法屬于代碼調(diào)優(yōu),代碼調(diào)優(yōu)涉及很多編碼技巧,需要使用者對(duì)所使用語(yǔ)言的 API 也非常熟悉。有時(shí)候,對(duì)算法、數(shù)據(jù)結(jié)構(gòu)的靈活使用,也是代碼優(yōu)化的一個(gè)重要內(nèi)容。比如,常用的降低時(shí)間復(fù)雜度的方式,就有遞歸、二分、排序、動(dòng)態(tài)規(guī)劃等。

一個(gè)優(yōu)秀的實(shí)現(xiàn),比一個(gè)拙劣的實(shí)現(xiàn),對(duì)系統(tǒng)的影響是非常大的。比如,作為 List 的實(shí)現(xiàn),LinkedList 和 ArrayList 在隨機(jī)訪問(wèn)的性能上,差了好幾個(gè)數(shù)量級(jí);又比如,CopyOnWriteList 采用寫(xiě)時(shí)復(fù)制的方式,可以顯著降低讀多寫(xiě)少場(chǎng)景下的鎖沖突。而什么時(shí)候使用同步,什么時(shí)候是線程安全的,也對(duì)我們的編碼能力有較高的要求。

這部分的知識(shí),就需要我們?cè)谄匠5墓ぷ髦凶⒁夥e累。

高效實(shí)現(xiàn)在平時(shí)的編程中,盡量使用一些設(shè)計(jì)理念良好、性能優(yōu)越的組件。比如,有了 Netty,就不用再選擇比較老的 Mina 組件。而在設(shè)計(jì)系統(tǒng)時(shí),從性能因素考慮,就不要選 SOAP 這樣比較耗時(shí)的協(xié)議。再比如,一個(gè)好的語(yǔ)法分析器(比如使用 JavaCC),其效率會(huì)比正則表達(dá)式高很多。

總之,如果通過(guò)測(cè)試分析,找到了系統(tǒng)的瓶頸點(diǎn),就要把關(guān)鍵的組件,使用更加高效的組件進(jìn)行替換。在這種情況下,適配器模式是非常重要的。這也是為什么很多公司喜歡在現(xiàn)有的組件之上,再抽象一層自己的;而當(dāng)在底層組件進(jìn)行切換的時(shí)候,上層的應(yīng)用并無(wú)感知。

Part7JVM 優(yōu)化

因?yàn)?Java 是運(yùn)行在 JVM 虛擬機(jī)之上,它的諸多特性,就要受到 JVM 的制約。對(duì) JVM 虛擬機(jī)進(jìn)行優(yōu)化,也能在一定程度上能夠提升 JAVA 程序的性能。如果參數(shù)配置不當(dāng),甚至?xí)斐?OOM 等比較嚴(yán)重的后果。

目前被廣泛使用的垃圾回收器是 G1,通過(guò)很少的參數(shù)配置,內(nèi)存即可高效回收。CMS 垃圾回收器已經(jīng)在 Java 14 中被移除,由于它的 GC 時(shí)間不可控,有條件應(yīng)該盡量避免使用。

JVM 性能調(diào)優(yōu)涉及方方面面的取舍,往往是牽一發(fā)而動(dòng)全身,需要全盤(pán)考慮各方面的影響。所以了解 JVM 內(nèi)部的一些運(yùn)行原理,還是特別重要的,它有益于我們加深對(duì)代碼更深層次的理解,幫助我們書(shū)寫(xiě)出更高效的代碼。

Part8小結(jié)

以上就是代碼優(yōu)化的 7 個(gè)大方向,我們通過(guò)簡(jiǎn)要的介紹,讓大家對(duì)性能優(yōu)化的內(nèi)容有了大體的了解。這7大方向是代碼優(yōu)化的最主要方向,當(dāng)然,性能優(yōu)化還包含數(shù)據(jù)庫(kù)優(yōu)化、操作系統(tǒng)優(yōu)化、架構(gòu)優(yōu)化等其他一些內(nèi)容,這些不是我們的重點(diǎn)。

本文時(shí)適合案例分析后回讀,更加能夠加深你對(duì) Java 性能優(yōu)化的理解。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2975

    瀏覽量

    105161
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    11577

原文標(biāo)題:Java性能優(yōu)化的七個(gè)方向

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    看一下射頻電路中的那些無(wú)源器件

    今天我們一起來(lái)看一下射頻電路中的那些無(wú)源器件。和數(shù)字和低頻電路類(lèi)似,射頻電路也分為無(wú)源器件和有源器件
    發(fā)表于 10-08 16:03 ?910次閱讀
    <b class='flag-5'>看一下</b>射頻電路中的那些無(wú)源器件

    哪位大神幫忙看一下

    `我的keil用不了,幫我看一下,怎么解決啊`
    發(fā)表于 04-13 21:32

    請(qǐng)幫忙看一下

    請(qǐng)幫看一下這個(gè)圖有問(wèn)題嗎,改成這樣可以
    發(fā)表于 12-16 19:37

    麻煩哪位大神幫忙看一下這塊microsemi ProASIC3 Starter Kit的板子都有些啥東西

    本帖最后由 黑夜白羊 于 2016-10-19 19:26 編輯 新手剛開(kāi)始學(xué)FPGA,老師給推薦的這塊板子,先讓我看一下這塊板子都有沒(méi)有緩沖存儲(chǔ)器,ROM,RAM之類(lèi)的東西再?zèng)Q定買(mǎi)不買(mǎi),麻煩哪位大神幫忙看一下
    發(fā)表于 10-19 19:12

    大家看一下這個(gè)是什么元件

    這是個(gè)升壓模塊里邊的,由于被商家把型號(hào)抹掉了也不知道是什么?哪個(gè)老師看一下是什么?假設(shè)上邊的角是1 左下角是2 右下角是3得出的數(shù)據(jù)我已經(jīng)寫(xiě)在紙上了,字丑希望可以看懂
    發(fā)表于 11-27 23:27

    哪位大神可以幫我看一下這塊板子?

    新人剛上手,調(diào)試了好段時(shí)間,直不出圖像,這就是VGA轉(zhuǎn)HDMI的板子,還有塊對(duì)接搞定了,這個(gè)側(cè)板實(shí)在是弄不出來(lái)了。有沒(méi)有人可以幫我看一下
    發(fā)表于 10-26 15:17

    詳解java代碼優(yōu)化方法

    的,還能在定程度上避免未知錯(cuò)誤,常用的Java代碼優(yōu)化細(xì)節(jié)如下:1. 為類(lèi)、方法指定final修飾符為類(lèi)指定final修飾符可以讓類(lèi)不可以
    發(fā)表于 04-02 15:43

    485 modbus優(yōu)化問(wèn)題 請(qǐng)求幫忙看一下 謝謝

    請(qǐng)問(wèn)我單臺(tái)表正常讀數(shù)會(huì)出現(xiàn)停頓現(xiàn)象 如果我加個(gè)for循環(huán)讀取會(huì)延遲讀取時(shí)間 而不能秒讀取個(gè)請(qǐng)大神幫我看一下怎么優(yōu)化 謝謝
    發(fā)表于 10-18 14:28

    針對(duì)于Java的35 個(gè)代碼性能優(yōu)化總結(jié)

    針對(duì)于Java的35 個(gè)代碼性能優(yōu)化總結(jié) 前言代碼優(yōu)化個(gè)很重要的課題。可能有些人覺(jué)得沒(méi)用,
    發(fā)表于 06-19 21:03

    嵌入式Java虛擬機(jī)的性能優(yōu)化技術(shù)

    ——JMO+(JMOplus)的性能優(yōu)化技術(shù)。 在過(guò)去的幾年里,Java已經(jīng)在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用,尤其是無(wú)線移動(dòng)領(lǐng)域,全球180多個(gè)移動(dòng)運(yùn)營(yíng)商已經(jīng)推出了Java下載服務(wù)。無(wú)線手持
    發(fā)表于 07-18 06:26

    關(guān)于java性能優(yōu)化些細(xì)節(jié)

    ,但是,吃的小蝦米多之后,鯨魚(yú)就被喂飽了。代碼優(yōu)化也是樣,如果項(xiàng)目著眼于盡快無(wú)BUG上線,那么此時(shí)可以抓大放小,代碼的細(xì)節(jié)可以不精打細(xì)磨
    發(fā)表于 10-11 09:23

    燃?xì)鉄崴靼踩珕?wèn)題,使用應(yīng)遵循一定規(guī)律

    燃?xì)鉄崴靼踩珕?wèn)題,使用應(yīng)遵循一定規(guī)律 燃?xì)鉄崴骱驮S多產(chǎn)品樣,使用應(yīng)遵循定的規(guī)律,只要按
    發(fā)表于 02-21 15:35 ?1144次閱讀

    看一下SMART高速計(jì)數(shù)向?qū)У膽?yīng)用

    SMART不僅支持利用指令編寫(xiě)高速計(jì)數(shù)程序的功能,還提供了便捷的高速計(jì)數(shù)向?qū)Чδ埽恍枰?jiǎn)單組態(tài)就可以自動(dòng)生成程序,而且程序未進(jìn)行加密,生成后可以修改。下面一起來(lái)看一下向?qū)绾谓M態(tài)吧
    的頭像 發(fā)表于 11-20 15:30 ?3454次閱讀

    優(yōu)化嵌入式軟件時(shí)可以遵循幾個(gè)通用技巧盤(pán)點(diǎn)

    早前的專(zhuān)欄中曾討論過(guò)在許多情況需要優(yōu)化的嵌入式系統(tǒng)的關(guān)鍵特征,包括系統(tǒng)時(shí)序、代碼大小、RAM使用率和能耗。雖然優(yōu)化每個(gè)特征通常要求不同的方法和技術(shù),但開(kāi)發(fā)人員在優(yōu)化嵌入式軟件時(shí)
    發(fā)表于 03-08 14:40 ?678次閱讀

    使用Arthas火焰圖工具的Java應(yīng)用性能分析和優(yōu)化經(jīng)驗(yàn)

    分享作者在使用Arthas火焰圖工具進(jìn)行Java應(yīng)用性能分析和優(yōu)化的經(jīng)驗(yàn)。
    的頭像 發(fā)表于 10-28 09:27 ?371次閱讀
    使用Arthas火焰圖工具的<b class='flag-5'>Java</b>應(yīng)用<b class='flag-5'>性能</b>分析和<b class='flag-5'>優(yōu)化</b>經(jīng)驗(yàn)
    必盛国际| 大发888官方备用| 做生意家里摆什么招财| 百家乐官网视频计牌器| 大发888棋牌游戏官网| 赌场百家乐攻略| 百家乐官网玩法规| 百家乐官网加牌规则| 大发888移动版| 百家乐现金网信誉排名| 肯博百家乐官网的玩法技巧和规则 | 百家乐官网如何抽千| 临安市| 棋牌游戏平台有哪些| 旅百家乐赢钱律| 最好的百家乐投注| 永利百家乐官网的玩法技巧和规则 | 百家乐官网赌场赌场平台| 城市| 六合彩网上投注| 二八杠开户| 百家乐赌注| 百利宫百家乐现金网| 大三巴百家乐官网的玩法技巧和规则 | 百家乐官网ho168平台| 赌博技巧| 大发888下载官方| 金钱豹百家乐的玩法技巧和规则 | 网上百家乐作弊法| 百家乐玩法既规则| 木星百家乐官网的玩法技巧和规则 | 大发888真钱游戏注册| 狮威百家乐娱乐| 免费百家乐官网倍投工具| 百家乐官网奥| 百家乐官网庄家必赢诀窍| 百家乐官网玩法教学视频| 耒阳市| 正网开户| 娱乐城官方网| 大发888案件|