L2J Server • View topic - Javolution/Trove/Javaの和訳


全然定番じゃない、L2Jの和訳シリーズ
L2J Server • View topic - Javolution/Trove/Java(要ログイン)
Javolutionも、Troveも、基本的にはJavaの高速ライブラリですw
わたし自身は、ソフトの高速化ってあんまじっくり研究したことないからなあ
ハッシュマップって、むかーしにPCのお勉強したときに、こういうデータ構造もあるよーぐらいでやったけど、実際に使ってるねんなあw
ましてやJavaアセンブラレベルでの最適化って手法もないだろうし。
ちなみに、今のL2JにはビルドするときにTroveもJavolutionもはいってるから、どっかで使ってる(or使用予定)なんでしょーか


まースタート!




by Forsaiken Thu Feb 18, 2010 9:43 pm


Hi.
こんにちは。


Just wanted to give u some infos about all that FastMap/TIntHashs.
FastMap/TIntHashsに関する全ての情報を提供します。


We start with: FastMap
まずはFastMapから。


A FastMap is nothing else then an regular HashMap/THashMap, but has a big difference... all entries are LINKED!
FastMapは、一般的なHashMap/THashMap以外の何者でもありません。が、大きな違いがあって、すべてのエントリーがリンクされてる、ということです。


Thats also the reason why FastMap iterations are much faster then iterating over an HashMap or using forEach on THashMap.
FastMapのループ構造はHashMapのループやTHashMapでforEachを使うのよりずっと
早い、というのも理由です。


Whats "setShared()" on FastMap?
FastMapの「setShared()」は何なんでしょう?


This flag does 2 things:
このフラグは、2つの処理を行います。


1: The linked entries never loose it`s links to the prev/next entry which results in an "save" iteration while removing/adding values to an map.
1.マップに値を削除/追加する間でも、リンクされたエントリーは保存ループの結果の前後のエントリーへのリンクを見失わない。


2: It will self synchronized when adding/removing values, like "synchronized(map){map.put(key, value);}"
値を追加/削除する時に、"synchronized(map){map.put(key, value);}"みたいな感じで自身の同期をとります。


Ofc this synchronisation slows down the FastMap because it must enter the thread monitor when adding/removing values.
この同期で、FastMapは速度が低下します。なぜなら、値を追加/削除するときにスレッドモニターの監視下にはいらないといけないからです。


Well Trove is not far away form the Java originals (in basics) but as u know it use primitive datatypes as key/value. So far u need to sync every access to the map if u don`t want urgend exceptions or fails. ReentrantReadWriteLock is ur friend again.
んで、Troveは基本的なオリジナルのJavaと遠くなく、ご存知のとおり、キー/値のデータ型として原始的な方法を使っています。このため、火急の例外や失敗を望まないのであれば、すべてのアクセスをマップと同期させないといけません。Re-entrantReadWriteLock(再度の読み書きからの保護)は、懐かしくもあなたの友だちになってくれるでしょう。



When to use Trove, Java, Javolution?
んでは、Trove、Java、Javolutionを使うときはどうなのでしょう?

(訳者注:THashMapTIntObjectHashMapはTrove、FastMapはJavolution、HashMapJava


using:
THashMap
TIntObjectHashMap
FastMap
HashMap



Put (already in map)
THashMap: 204%
TIntObjectHashMap: 89%
FastMap: 198%
HashMap: 100%



PutIfAbsent (already in map)
THashMap: 160%
TIntObjectHashMap: 45%
FastMap: 100%
HashMap: -



Get (in map)
THashMap: 189%
TIntObjectHashMap: 49%
FastMap: 137%
HashMap: 100%



Get (not in map)
THashMap: 295%
TIntObjectHashMap: 50%
FastMap: 139%
HashMap: 100%



ContainsKey (in map)
THashMap: 177%
TIntObjectHashMap: 34%
FastMap: 136%
HashMap: 100%



ContainsKey (not in map)
THashMap: 292%
TIntObjectHashMap: 39%
FastMap: 145%
HashMap: 100%



ContainsValue (in map avg)
THashMap: 143%
TIntObjectHashMap: 150%
FastMap: 57%
HashMap: 100%



ContainsValue (not in map)
THashMap: 123%
TIntObjectHashMap: 142%
FastMap: 85%
HashMap: 100%



Iterate
THashMap: 92%
TIntObjectHashMap: 113%
FastMap: 35%
HashMap: 100%


Less = better.
As u can see Trove is ONLY suitable for primitives!
So if u have to iterate more often or do not have an primitive as a key use Javolution.

小さいほうが良い結果になります。
Troveが原始的な方法には適しているようにみえます!
なので、もしよりループを多用しなければならないのであれば、Javolutionを原始的なキーとして持たないようにする。


And now about the lists....
FastList is an LINKED list. If u know the final size of the list or now that u have to add more then > 8 entrys an ArrayList is faster (even with expand)!!! Specialy those cases where u fill into FastList and use toArray()!!!


Hopefully this will help u somehow.
listについても述べておきます。
FastListはリンクしているリストです。もし、リストの最終的なサイズが見込めているのであれば、8エントリー以上のArrayListを追加しなければならず、それは高速化できます(拡張も含めて同等)!!!特に、FastListで一杯にしたり、とArray()を使う場合がそうです!!!