簡體   English   中英

在 Spring Rest Controller 中執行的方法比純 Z93F725A07423FE1C889ZBF48 項目慢得多

[英]Method executed inside a Spring Rest Controller is significantly slower than in a pure java project

背景:我正在開發一個為用戶提供優化算法的 spring web 應用程序。 在純 java 項目中執行時,我的算法的性能是可以接受的。 但是,在 spring 項目中通過 rest controller 調用它會導致我想了解的巨大性能差距。

測試/觀察:當然,所有測試都在同一硬件上執行。 優化算法獨立於 spring,即它接收一些基本的 java 對象作為輸入並返回結果。 正如您在下表中看到的那樣,在 spring 中執行我的算法至少需要兩倍的時間,它可以保持 5 次迭代和 100 次迭代(即開始時沒有恆定的開銷)。

迭代次數 [No.] 純 Java [毫秒] Spring [毫秒]
5 ~200 ~ 400
100 ~1400 3500 - 5000

我完全理解 web 應用程序會導致我的機器上的一些開銷(彈簧、angular 等)。 但是,您真的會期望如此巨大的性能影響嗎? 本質上,這只是一個小的測試數據集,現實世界的數據集將更具挑戰性。

為了更詳細地解釋我是如何測量這個的:

  • 我有一個Optimization.class ,其中包含一個public static Result optimize(Data data){} Data.class是一個 POJO,沒有任何對 spring 實體的引用。
  • optimize()是一種具有 5 或 100 次迭代的進化算法。 上面給出的時間僅在optimize()內部測量,但使用System.currentTimeInMillis()圍繞迭代循環進行測量。 因此,我的方法只觸發一次,但執行了不同次數的迭代,我只測量我的算法中這些迭代需要多長時間。
  • Pure Java意味着我創建了一個public static void main(String[] args)准備Data.class並調用optimize()
  • Spring表示我創建了一個 rest optimize()准備Data.class

主要問題:我非常感謝任何有助於更詳細地理解這個問題的幫助。 目前我正在考慮以下問題:

  • 哪些因素會影響在 spring rest controller 中執行的方法的性能?
  • 我可以以某種方式配置 spring 如何使用給定的硬件嗎?
  • 是否有任何替代方法可以從客戶端訪問算法,即 rest controller 的替代方法?
  • 以某種異步方式執行我的算法並稍后再次調用服務器以接收結果是否有幫助?

在不知道您測量的確切方式的情況下,這些數字可能意味着完全為零(因為它們與它們的含義無關)。

如果您只是測量了5次和100執行,那么您只測量了這些方法的“冷啟動”,而 Spring 明顯慢的事實是非常值得期待的; 如果您知道 Spring 如何在幕后工作。 Spring will create proxies for all of your rest controller methods, that will go under a tomcat under the hood too... To simplify what I mean, throw an Exception in your @RestController and look at the stacktrace - you would be surprised of it's深度,我想。

好消息是,一旦您多次調用 rest 方法, JVM將優化很多事情,並且調用將比您最初進行的調用快得多。 盡管如此,您將永遠無法擊敗簡單的方法調用與通過 spring controller 調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM