2010-02-01 14 views
5

Zastanawiam się nad tym od jakiegoś czasu. W CouchDB mamy kilka identyfikatorów dość zalogować ... np:Wydajność długich identyfikatorów

„000ab56cb24aef9b817ac98d55695c6a”

Teraz, jeśli szukasz tej pozycji i przechodząc przez strukturę drzewa utworzone przez widok. Wydaje się, że jest to prosta liczba całkowita, ponieważ identyfikator byłby znacznie szybszy. Gdybyśmy używali 64-bitowych liczb całkowitych, byłby to prosty CMP, a następnie JMP (zakładając, że kod Erlanga używa JIT, ale rozumiem).

W przypadku ciągów zakładam, że generujemy hasz z identyfikatora lub coś takiego, ale w pewnym momencie musimy wykonać porównanie znaków na wszystkich 33 znakach ... czy to nie wpłynie na wydajność?

+0

Dzięki za odpowiedzi. Uwielbiam elegancję, na którą pozwalają długie łańcuchy. A teraz moje obawy dotyczące wydajności są zmniejszone. –

Odpowiedz

2

Krótka odpowiedź brzmi: tak, oczywiście wpłynie to na wydajność, ponieważ długość klucza będzie miała bezpośredni wpływ na czas potrzebny do schodzenia w dół drzewa.

Wpływa także na przechowywanie, ponieważ dłuższe klawisze zajmują więcej miejsca, a miejsce zajmuje trochę czasu.

Jednak brak niuansów polega na tym, że podczas gdy kanapka MOŻE (i ma) przydziela nowe identyfikatory, nie jest wymagane. Z przyjemnością zaakceptujemy własne identyfikatory, a nie wygenerujemy własne. Tak więc, jeśli długość klucza przeszkadza Ci, możesz używać krótszych klawiszy.

Jednak biorąc pod uwagę "jsonową" naturę kanapy, jest to raczej baza danych "tekstowa". Nie ma zbyt wiele danych binarnych przechowywanych w normalnej instancji Couch (załączniki nie są odporne, ale nawet te, które moim zdaniem są przechowywane w BASE64, mogę się mylić).

Tak więc, chociaż tak, 64-bitowy byłby najbardziej wydajny, prosty fakt jest taki, że kanapa zaprojektowana jest do pracy dla dowolnego klucza, a "dowolny klucz" jest najłatwiejszy do wyrażenia w tekście.

Wreszcie, prawdę mówiąc, koszt porównania klucza jest pomniejszony przez czasy pobierania we/wy dysku, a JSON gromadzi dane (szczególnie przy zapisach). Wszelkie rzeczywiste zyski osiągnięte przez konwersję do takiego systemu prawdopodobnie nie miałyby wpływu na "rzeczywisty świat" na ogólną wydajność.

Jeśli chcesz naprawdę przyspieszyć system klawiszy Couch, zakoduj kluczową procedurę, aby zablokować klucz do 64Bit longs i dołącz je (tak jak powiedziałeś). 8 bajtów tekstu jest takie samo jak 64-bitowe "długie int". Daje to teoretycznie 8-krotny wzrost wydajności w porównaniu z kluczem. Niezależnie od tego, czy erlang może stworzyć taki kod, nie mogę powiedzieć.

+0

Świetna odpowiedź Will, thanks. –

2

Z CouchDB: Ostateczne przewodnik:

muszę narysować obraz tego co jakiś punkt, ale to dlatego, jeśli myślisz o wyidealizowanym btree, kiedy używanie UUID na być może trafiasz na dowolną liczbę węzłów root w tym drzewie, więc z naturą tylko dopisz masz , aby napisać każdy z tych węzłów i wszystko powyżej w drzewie. ale , jeśli używasz monotonicznie rosnących identyfikatorów , to unieważniasz tę samą ścieżkę w dół po prawej stronie drzewa , minimalizując w ten sposób liczbę węzłów , które należy przepisać. będzie być tak samo dla monotonicznie zmniejszającym się . i powinno to być technicznie skuteczne, jeśli aktualizacje mogą być gwarantowane trafienie jednego lub dwóch węzłów w środku drzewa, choć jest trudniejsze do udowodnienia.

Identyfikatory sekwencyjne oferują korzyści związane z wydajnością, jednak należy pamiętać, że nie można ich utrzymywać, jeśli istnieje więcej niż jedna baza danych, ponieważ identyfikatory będą kolidować.

Powiązane problemy