2009-06-10 18 views

回答

9

雖然存在性能損失,但它相對較低,可以忽略不計。這裏的關鍵問題是,使用ORM(反思)所帶來的好處遠遠超過您付出的非常小的性能損失。

請記住,在看性能時,按照自己想要的方式設計系統,並在出現問題時擔心性能。

10

退房Hibernate Q&A section in FAQ,這幾乎是所有關於實例發出

在 的Hibernate的最新版本,「反思」通過CGLIB運行時字節碼 生成庫優化 。這意味着 「反映」屬性獲取/設置調用 不再承載Java反射API的開銷,實際上只是普通的方法調用 。這導致 (非常)小的性能增益。

+3

只是爲了記錄,這個FAQ現在已經過時了。 CGLIB不再是Hibernate的默認反射提供者:從Hibernate 3.3開始,CGLIB已被Javassist替代爲默認提供者。 – Cowan 2009-06-10 10:33:05

+0

真的嗎?很高興知道:) – 2009-06-10 16:56:27

15

是的,它可能是。 Hibernate在各種狡猾的方式中都經過了相當多的優化,但是假設緩存對你沒有幫助,它仍然比低級別的數據訪問慢得多。

但這不是你需要問的問題。

你需要問清楚它是否會影響性能顯着 - 在這一點上,我懷疑你會發現答案是「否」。就Hibernate而言,底層數據庫訪問可能會比由於Hibernate造成的開銷慢。就Spring而言,bean的創建往往只發生在程序的開始階段,一次。

一如既往,如果您有疑慮,基準和配置一個現實的場景。

2

在任何合理的應用中,反射的開銷很大的可能性是遙遠的。 (總是有不合理的應用:)

爲了比較,通過配置文件運行您的應用程序,並查看JDBC驅動程序使用了多少內存/ cpu。

休眠和彈簧的重要之處在於它們旨在優化您的性能,使您的工作效率更高,代碼更可靠。

UPDATE: 我覺得自己和飛碟雙向先生正試圖讓一點是,在這些框架使用反射的性能損失較小。這與反思是實施這些框架的重要組成部分的事實相結合意味着沒有多少選擇。

1

你只能找出你是否測量你的特定工作量。

假設檢索+保溼100個實體Spring + Hibernate會增加3毫秒的開銷。

如果你的工作單元通常需要120毫秒,那麼開銷非常小。如果它需要5毫秒,那麼這很嚴重。