解
- 消息摘要=>每當需要
- 的KeyFactory =>使用單個共享實例
- 的SecureRandom =>使用StackObjectPool創建新實例
- 密碼=>使用StackObjectPool
我面對一個普通的dilemna而編碼安全框架:「到池或不池」泳池或不游泳池的Java加密服務提供商
基本上這個問題是在兩個「團」分爲:
組1:
SecureRandom
,因爲對nextBytes(...)
的呼叫被同步,並且它可能成爲WebApp /多線程應用的瓶頸組2:加密服務提供商,如
MessageDigest
,Signature
,Cipher
,KeyFactory
,...
(因爲getInstance()
的成本是多少?)你是什麼看法?
你在這些問題上的習慣是什麼?
編輯2013年9月7日
我終於抽出時間由我自己來測試@Qwerky Share
類,我覺得結果很令人吃驚......。
該課程缺乏我主要關心的問題:池類似GenericObjectPool或StackObjectPool。
所以我已經修改了類來測試所有4個備選方案:
我不得不將循環次數降低到100000次,因爲1M會花費太多時間處理池。
我還在每個循環的末尾添加了一個Thread.yield()
以使負載具有更好的形狀。
結果(累積性運行時):
- 消息摘要
- 新的實例:420秒
- 單實例:550章第
- StackObjectPool:800小號
- GenericObjectPool:1900小號
- 個的KeyFactory
- 新的實例:400S
- 單實例:350小號
- StackObjectPool:2900小號
- GenericObjectPool:3500小號
- SecureRandom的
- StackObjectPool:1600小號
- 新實例:2300小號
- GenericObjectPool:2300S
- 單實例:2800
- 密碼
- StackObjectPool:2800
- GenericObjectPool:3500小號
- 單實例:5100小號
- 新實例:8000 s
結論
對於消息摘要和的KeyFactory,池PERF殺手,而且比用同步的瓶頸單個實例更糟糕,而他們當它涉及到的SecureRandom和密碼
重複使用歸結爲昂貴創建和同步訪問的開銷之間的折衷。只有您可以選擇,並取決於您的使用情況。請注意,兩組之間沒有區別,如果共享線程之間的實例,則必須同步訪問「MessageDigest」等。 – Qwerky
當然@Qwerky任何選項都需要線程/使用塊之間的同步。問題在於你如何在應用程序中處理thoses類? – Cerber
這真是太棒了---我希望這樣的信息更容易適用於各種課程。真的,我希望它是在標準的Javadoc。 –