Я хочу улучшить сборщик мусора D, добавив некоторые эвристики, чтобы избежать запусков сборки мусора, которые вряд ли приведут к значительному освобождению. Одна эвристика, которую я хотел бы добавить, заключается в том, что GC не следует запускать более одного раза за X времени (возможно, один раз в секунду или около того). Для этого мне нужен таймер со следующими свойствами:
Он должен быть в состоянии захватить правильное время с минимальными накладными расходами. Вызов
core.stdc.time
занимает время, примерно эквивалентное небольшому выделению памяти, так что это не лучший вариант.В идеале должен быть кроссплатформенным (как ОС, так и ЦП) для простоты обслуживания.
Сверхвысокое разрешение не так уж важно. Если время точное, может быть, до 1/4 секунды, этого достаточно.
Должен работать в многопоточном/многопроцессорном контексте. Инструкция x86
rdtsc
не будет работать.
РЕДАКТИРОВАТЬ: простая старая функция C clock()
кажется достаточно быстрой. Однако здесь переполнение является проблемой. В 32-битных Windows и Linux clock_t
определяется как 32-битное целое число со знаком. Когда он переполняется, становится ли он отрицательным, или функция clock()
использует дополнительную логику, чтобы заменить его на ноль? Если он обернут до нуля, то это поможет. Если он превращается в отрицательный (который также представляет коды ошибок и т. д.), то он не будет работать.
Изменить № 2: я все равно попробовал эвристику, используя clock()
и игнорируя проблему переполнения, просто в качестве теста. Он работает настолько плохо, что не стоит дальнейшего изучения.