2011-09-27 24 views
5

Czy są jakieś opublikowane mikro-benchmarki, które porównują ze sobą zmienne i niezmienne kolekcje Scali ze zbiorami w java.util.concurrent, w środowiskach wielowątkowych ? Szczególnie interesują mnie przypadki, w których czytelnicy znacznie przewyższają pisarzy, takich jak buforowanie HashMaps w kodzie po stronie serwera.Micro-benchmark porównujący zmienne, niezmienne kolekcje Scala z java.util.concurrent. * Kolekcje

Mikro-poziomy odniesienia kolekcji Clojure również byłyby dopuszczalne, ponieważ ich algorytmy są podobne do tych używanych w trwałych kolekcjach Scala 2.8.

Będę pisać własne, jeśli już nie zostało to zrobione, ale pisanie dobrych mikro-benchmarków nie jest banalne.

+0

Sądzę, że jest bardzo mało prawdopodobne, że uzyskasz rozsądny poziom odniesienia, który porównuje zbiory zmienne i niezmienne, ponieważ sam projekt aplikacji jest inny. –

+0

@Daniel: Obecnie mamy trochę kodu serwera Java, który zawiera HashMaps, które są czytane około 1 000 000 razy przy każdym zapisie. Kod używa 'zsynchronizowanego', ale czytelnicy płacą karę za wszystkie te sprzeczne odczyty, mimo że dane są niezmienne. Pomyślałem, że będę mógł używać trwałych kolekcji z funkcjonalnosci i blokady tylko wtedy, gdy wymienię starą kolekcję na nową "skopiowaną" kolekcję zawierającą nowy przedmiot. – Ralph

+0

Wygląda na uzasadnione oczekiwanie i ilustruje problem z testami porównawczymi. Jeśli testujesz tego rodzaju ładunek, promujesz niezmienność. Ale pamiętaj, że używając niezmiennych map, musisz zawsze aktualizować mapę, co oznacza, że ​​musisz jakoś serializować wszystkie aktualizacje. Sama mapa może być wskazywana przez zmienną, jeśli nie masz nic przeciwko temu, co czyta pozostające w tyle. –

Odpowiedz

2

Istnieją pewne wyniki porównujące mapy Java hash, mapy hash Scala, Java mapy współbieżne hash Java list współbieżne skip tablice równoległe Java i Scala równoległe kolekcje tutaj (na końcu raportu technicznego):

http://infoscience.epfl.ch/record/165523/files/techrep.pdf

jest bardziej szczegółowe porównanie jednoczesnych Pomiń listę i Java współbieżne hash mapy tutaj (również po zakończeniu głównej części raportu, przed załączniku):

http://infoscience.epfl.ch/record/166908/files/ctries-techreport.pdf

Te mikro testy porównawcze koncentrują się na testowaniu wydajności pojedynczej operacji. Jeśli planujesz napisać swoje własne standardy, to prawdopodobnie będzie przydatne:

http://buytaert.net/files/oopsla07-georges.pdf

+0

Bardzo ładne! Dzięki. – Ralph

+0

Kod źródłowy niektórych benchmarków można znaleźć tutaj: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/test/benchmarks/, ale są one nieco nieuporządkowane. Na drugi: https://github.com/axel22/Ctries, spójrz na src/bench. – axel22

+0

Oto szczegółowe testy porównawcze operacji zbierania w Scala: https://github.com/scalameter/scalameter/tree/master/src/test/scala/org/scalameter/collections – axel22

0

Dlaczego nie spróbujesz użyć java.util.concurrent.ConcurrentHashMap, a następnie? w ten sposób nie musisz synchronizować, a twój milion odczytów będzie znacznie szybszy (jak i jeden zapis).

+1

Wierzę, że to błąd. Jeśli odczytasz wartość (zmienną) z HashMap, zaktualizujesz tę wartość, a następnie spróbuj przywrócić, musisz jeszcze zsynchronizować operację. Nie jestem pewien, czy możesz to zrobić za pomocą 'replace'. – Ralph

+0

Inną opcją byłoby użycie STM Clojure (można go używać z Javy). Chociaż nie jestem pewien, jak używałbyś go z HashMap ... – Chochos