2014-11-28 12 views
5

GHC Haskell naraża pakiet prim, który zawiera definicję wartości odpakowanych, takich jak Int#, Char# itpCo to jest wartość unboxed w GHC Haskell i kiedy powinniśmy ich używać?

  • W jaki sposób różnią się od domyślnego Int, Char itp typy w regularnych Haskell? Zakłada się, że są szybsze, ale dlaczego?
  • Kiedy powinieneś sięgnąć, aby użyć ich zamiast standardowych pudełek?
  • W jaki sposób użycie wartości Boxed vs Unboxed wpływa na program?
+1

Napisałem [artykuł] (http://alpmestan.com/posts/2013 -10-02-oh-my-laziness.html) o tym, możesz chcieć dać mu szansę. –

Odpowiedz

11

W prostych słowach wartość typu Int może być wyrażeniem niedoszacowanym. Faktyczna wartość nie jest obliczana, dopóki "nie spojrzysz" na wartość.

Wartość typu Int# jest ocenianym wynikiem. Zawsze.

W wyniku tego, Int struktura danych, która żyje na stercie. Numer Int# to ... 32-bitowa liczba całkowita. Może żyć w rejestrze procesora. Możesz operować na nim za pomocą pojedynczej instrukcji maszyny. Nie ma prawie żadnych kosztów ogólnych.

Natomiast, kiedy piszesz, powiedzmy, x + 1, nie jesteś rzeczywiście computing x + 1, jesteś tworząc strukturę danych na stercie, który mówi „, gdy chcemy obliczyć to zrobić x + 1 ".

Krótko mówiąc, Int# jest szybszy, ponieważ nie może być leniwy.

Kiedy należy go używać? Prawie nigdy. To jest praca kompilatora. Pomysł polega na tym, że piszesz ładny wysokopoziomowy kod Haskella z udziałem Int i , kompilator wymienia gdzie może zastąpić Int z Int#. (Mamy nadzieję!) Jeśli tak nie jest, prawie zawsze łatwiej jest rzucić kilka adnotacji o ścisłości, niż grać bezpośrednio z Int#. (Jest także nieprzenośny, tylko GHC używa Int# - chociaż obecnie nie ma żadnych innych powszechnie używanych kompilatorów Haskell.)

+3

Kilka dni temu porównałem wydajność 'Int's (z surową oceną) i' Int # '. W kompilacji z '-O2', dosłownie * nie ma różnicy * w wydajności. GHC dobrze wykonuje tę pracę. – Tomo

+1

Możesz też spojrzeć na wygenerowany rdzeń, aby zobaczyć, gdzie GHC jest typem rozpakowywania – jberryman

Powiązane problemy