2011-04-04 60 views
3

在C/C++中構建LRU類型高速緩存並讓Java通過JNI訪問它會對性能有所幫助嗎?通過JNI訪問C中的高速緩存

+0

這完全取決於你正在緩存什麼。實施,配置文件,觀察。 – 2011-04-04 23:55:03

回答

6

可疑

的JVM做了很多體面的工作,這些天,特別是考慮到需要緩存的應用程序可能會熬夜足夠長的JVM優化它頗有幾分。無論您的緩存代碼如何通過避免使用JVM來獲得速度,您可能會失去在JNI中來回推送對象。

更不用說與Java相比C++代碼的固有開發,維護和部署困難。或者通過推出自己的緩存重新發明輪子的危險 - 必須有可以使用的東西,而不是推出自己的緩存。

+0

雖然每個人的回答都是我正在尋找的,但是您的選票卻是最高的。所以我會給你答案:)並且也贊成每個人。感謝大家。 – 2011-04-09 22:41:02

1

JIT編譯器非常快速。它與編譯的代碼相媲美。

最好的辦法是在任何最容易開發的地方實現它,然後對其進行配置以識別性能問題。然後,看看你可以從那裏做些什麼。

1

不太可能。

緩存與堆中的對象一起工作。 C++中的堆內存分配和釋放並不比Java更好。事實上,在短期運行的測試中,由於推遲的GC,Java緩存甚至可能會獲勝(C++必須立即明確釋放內存)。由於JIT,這些操作(put,find)預計會與C++保持一致(這些都是熱點,並且很快會被編譯成本機代碼)。

注意:一如既往的性能,最終的答案只能通過測試獲得。

+1

即使在長時間運行的測試中,現在Java的內存管理通常會由於後者中的碎片而執行C. – 2011-04-05 03:20:38

4

你幾乎肯定沒有在這裏優化正確的東西。高速緩存實施很少什麼需要在大型系統中優化。 Java有很多好的和快速的實現。你不可能從本地實現中獲得更多的好處。即使你可以,你確定你真的需要嗎?

這通常是你在緩存中做的所有事情,實際上是重要。數據庫查詢,阻止操作和CPU密集型任務。您當然應該分析您的應用程序,並只優化需要它的區域。如果你正在優化一些只佔整體時間5%的東西,那麼你只能在最好的情況下獲得5%的提升(即,如果你的速度無限快)。

我已經處理了帶有大型緩存的大型系統,而且緩存實現的開銷非常低,最多隻有一位數的百分比。你應該確保你花時間在正確的事情上。我並不是說你可能不需要,我只是說這是可疑的,你應該先驗證。你沒有指出某種方式,所以我假設你有一個已知的緩存實現問題。