Выключение сборщика "мусора" D

Чтобы развернуть ответ runeh:

>>> def foo(a):
...    x = 2
...    return x + a

>>> import inspect

>>> inspect.getsource(foo)
u'def foo(a):\n    x = 2\n    return x + a\n'

print inspect.getsource(foo)
def foo(a):
   x = 2
   return x + a

EDIT: Как указано в @ 0sh, этот пример работает с использованием ipython, но не является простым python. В обоих случаях должно быть хорошо, при импорте кода из исходных файлов.

24
задан he_the_great 24 September 2009 в 05:15
поделиться

3 ответа

Выключить GC в D2:

import core.memory;

void main(string[] args) {
    GC.disable;
    // Do stuff.
}

При использовании D1/Phobos:

import std.gc;

void main(char[][] args) {
    std.gc.disable;
    // Do stuff.
}

В D1/Tango:

import tango.core.Memory;

void main(char[][] args) {
    GC.disable;
    // Do stuff.
}

GC может быть повторно включен так же путем вызова GC.enable (D2 или D1/Tango) или std.gc.enable (D1/Phobos). Они могут быть сделаны в любой точке в программе. Внутренне, счетчик используется, и на самом деле повторно включить GC, необходимо звонить, включают (), как только в течение каждого раза отключают (), был назван.

Вот некоторые вещи не сделать с отключенным GC, потому что они вызовут утечки памяти:

  1. не используют массив, добавляют (~ =) оператор или используют .length свойство для увеличения массива, который был уже выделен. Они полагаются на GC для освобождения старого массива, если это должно быть перераспределено, с тех пор там может искажать к нему где-то в другом месте в программе.
  2. не используют встроенные ассоциативные массивы. Единственный способ освободить их GC.
  3. большая часть Phobos и, я верю, Танго, были разработаны учитывая, что сборка "мусора" присутствует. Функции в этих библиотеках могут пропустить память ужасно, если используется w/o GC.
  4. не используют закрытия D2 с отключенным GC. (Не то, чтобы Вы были бы так или иначе для игры.)

Однако в то время как D разработан, чтобы быть применимым с GC, отключенным в нескольких критических частях кода (вид критических частей, где оперативные ограничения существуют и Вы, вероятно, не должны использовать форму malloc, не явно разработанного для вычислений в режиме реального времени во всяком случае), это было в основном разработано учитывая, что GC будет присутствовать. В Вашем случае можно все еще использовать GC для всего материала инициализации, и т.д. и только отключить его при ударе части игры, которая на самом деле должна быть реальным временем.

Как примечание стороны, GC и ручное управление памятью могут сосуществовать в D, и на практике, когда оптимизация кода, вручную удаление некоторых больших объектов с тривиальным временем жизни могут привести к значительным ускорениям. Это может быть сделано так же к C++, с помощью оператора удаления, и безопасно сделать, даже если GC включен. Когда у Вас нет оперативных ограничений, это приносит Вам большую часть пользы GC с большей частью выполнения ручного управления памятью.

41
ответ дан dsimcha 28 November 2019 в 23:10
поделиться

Если Вы хотите использовать malloc и бесплатное использование std.c.stdlib. GC никогда не будет касаться их. std.gc имеет весь материал, включая который Вы будете нуждаться для управления памятью, отключают ().

GC не является плохой вещью все же. Большинство, если совсем не все библиотеки в D будут иметь где-нибудь в коде, где память явно не удалена так, она не сделает Вас героем для имения его всегда прочь, но хорошо если у Вас будет некоторое критическое требование к производительности.

GC делает, все намного более продуктивное как разрезание массива и создание новых объектов в параметрах, не имея вызывающей стороны хранит ссылку где угодно на них. Хороший код является намного меньше из него, и с GC код становится намного меньшим.

8
ответ дан Tim Matthews 28 November 2019 в 23:10
поделиться

GC может быть удален и заменен простой оберткой вокруг malloc/free.

1
ответ дан BCS 28 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: