2014-12-24 14 views
25

Jeśli wiem, że pewna wartość prawdopodobnie przetrwa pierwsze spotkanie z śmieciarzem, czy jest jakiś sposób, aby powiadomić GHC, więc może to po prostu przydzielić bezpośrednio gdzieś poza przedszkolem? Na przykład, jeśli buduję dużą strukturę z kilku mniejszych elementów, wiem, że każdy element będzie trwał co najmniej do czasu zakończenia całej struktury.Czy można pominąć przedszkole?

+0

Jako mały meta-komentarz: Nienawidzę tego rodzaju pytań, ponieważ zawsze myślisz: "Nie, nie ma mowy". ale natychmiastowa myśl po tym jest: "Cóż, jestem pewien, że nie wiem * wszystkiego * o kompilatorze (może tylko jedna lub dwie osoby), a ponieważ jest to open source, oczywiście jest sposób na wszystko, co można obliczyć , ale ... to nie jest odpowiedź ... ". Czy ktokolwiek ma konstruktywne sposoby na odpowiedź na tego rodzaju pytanie? –

+7

Ta optymalizacja nazywa się "[wstępne] (http://www.memorymanagement.org/glossary/p.html#term-premature-tenuring)" - przeprowadzono pewne badania, ale nie wierzę, że to było włączone do dowolnego głównego kompilatora/środowiska wykonawczego. –

+0

@DanielWagner, poza wszelkimi funkcjami, które mogłem przegapić, zastanawiałem się, czy może istnieć jakiś trudny sposób wykorzystania mechanizmów GHC do radzenia sobie z dużymi i/lub obcojęzycznymi obiektami. Nie mogłem od razu zobaczyć czegoś takiego, ale * naprawdę * nie znam tych systemów. – dfeuer

Odpowiedz

23

W the GHC garbage collector nie ma haków do podpowiedzi w generowaniu, do którego należy przypisać obiekt. Jednakże, może być w stanie wykorzystać zachowanie operacyjną w kilka sposobów:

  • w zależności od typu danych, może być w stanie wykorzystać the pinned object regio n ominąć pokoleniowe etapy łącznie.

  • wykorzystać eager promotion poprzez zapewnienie, aby długo żył przedmiotu wskazuje się przez samo długo żył coś ...

  • wprowadzać dane do a CAF i obejścia dynamicznego przydzielania całkowicie.

+1

Niestety, co ja " m robi się zbyt polimorficzne, aby użyć przypinania, a przekształcanie danych w CAF nie jest zazwyczaj opcją. Jeśli edytujesz swoją odpowiedź, aby wyjaśnić nieco więcej, w jaki sposób mogę oszukać promocję, z przyjemnością przyjmuję tę odpowiedź. Uwaga: mój obecny przypadek użycia redukuje czas GC dla 'Data.Sequence.fromList', który jest nieco absurdalnie wysoki. – dfeuer

Powiązane problemy