有一個列舉,里面有40來個的列舉值,我需要通過這40來個列舉值呼叫同一個方法獲取對應的資料(一個列舉值能獲取到一個資料),并將資料添加到一個集合里。
我通過forEach回圈列舉值,然后回圈里呼叫獲取資料的方法,發現這樣耗時會很長。單個獲取的時候耗時只有10ms左右,但回圈就耗時很長。我想的是使用多執行緒訪問會不會提高速度,網上看說使用java8的List.parallelStream()方法本身就是多執行緒的,但我試了下耗時還是很長。
代碼截圖如下

uj5u.com熱心網友回復:
一個for回圈本身耗時不會太多的,耗時多的地方可能在getQuoteMainsByMessage方法里,你可以在該方法的入口和出口列印時間看看耗時情況,應該重點優化該方法而不是回圈本身。uj5u.com熱心網友回復:
getQuoteMainsByMessage這個方法執行很快的,之前沒用回圈,單個列舉值傳進去查詢,耗時基本在10到20msuj5u.com熱心網友回復:
你想確認是不是getO的那個方法慢,很簡單,你在回圈里不呼叫它,直接列印列舉類的值。如果回圈很快,那就是getO方法慢了。先定位到底是哪里慢你才能想對策。uj5u.com熱心網友回復:
目前猜測是es的問題,我用的本地裝的單機es,多執行緒訪問es的時候就會變慢uj5u.com熱心網友回復:
像這種功能,最好直接傳一個拼接字串,再用sql in,這樣只會執行一次。或者用自帶的批量查詢,這樣既便于后期維護,也最大程度減少查詢量。uj5u.com熱心網友回復:
這個不是查的資料庫,邏輯是通過賬單和賬單不同的費用項,先去redis里獲取到對應的所有型別網點,然后通過賬單的一些屬性和網點組合成查詢條件,最后通過條件去es里查詢資料,查詢的資料可能有多條,又會通過一些邏輯只取一條。感覺用in的話更復雜,除錯的時候看生成的es查詢陳述句本身已經很長了。
uj5u.com熱心網友回復:
回圈方法本身不會有太大性能差異的,主要性能在你呼叫的那個方法,你那個方法多半是跟資料庫打交道了。你要快的話,需要自己寫SQL批量讀取或者輸入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/157267.html
標籤:Java EE
上一篇:資料存盤計量單位換算
