2014-12-24 2 views
25

Если я знаю, что определенное значение, вероятно, переживет его первое знакомство с сборщиком мусора, есть ли способ сообщить GHC, чтобы он мог просто выделить его прямо где-нибудь за пределами детской? Например, если я собираю большую структуру из кучки меньших частей, я знаю, что каждая часть будет длиться, по крайней мере, до тех пор, пока вся структура не будет завершена.Можно ли пропустить питомник?

+0

В качестве небольшого мета-комментария: Я ненавижу этот вопрос, потому что вы всегда думаете: «Нет, нет способа». но немедленная мысль после этого: «Ну, я уверен, что я не знаю всего * о компиляторе (может быть, только один или два человека), и поскольку это открытый исходный код, конечно, есть способ сделать что-либо вычислимое , но ... на самом деле это не ответ ... ». Есть ли у кого-нибудь конструктивные способы ответить на этот вопрос? –

+7

Эта оптимизация называется «[pretenuring] (http://www.memorymanagement.org/glossary/p.html#term-premature-tenuring)». В ней были некоторые исследования, но я не думаю, что это было включен в любой компилятор/время выполнения. –

+0

@ DanielWagner, помимо любых функций, которые я, возможно, пропустил, я задавался вопросом, может ли быть какой-то сложный способ использовать механизмы GHC для работы с большими и/или посторонними объектами. Я не мог сразу увидеть такое, но я действительно не знаком с этими системами. – dfeuer

ответ

23

В the GHC garbage collector нет крючков для намека на генерацию, на которую должен быть выделен объект. Тем не менее, вы можете быть в состоянии использовать оперативное поведение нескольких способов:

  • в зависимости от типа данных, вы можете быть в состоянии использовать the pinned object regio п обойти поколения стадии в целом.

  • использовать eager promotion, обеспечивая ваш долгоживущий объект указывается сам долго жил то ...

  • сделать данные в a CAF и обводном динамическое распределение в целом.

+1

К сожалению, m делать слишком полиморфно, чтобы использовать пиннинг, и сделать данные в CAF обычно не является опцией. Если вы отредактируете свой ответ, чтобы объяснить немного больше, как я могу привлечь внимание к продвижению, я с радостью соглашусь с этим ответом. Примечание: мой текущий вариант использования уменьшает время GC для 'Data.Sequence.fromList', что несколько абсурдно высоко. – dfeuer