Быстрый кроссплатформенный таймер? - PullRequest
6 голосов
/ 22 февраля 2011

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

  1. Он должен быть в состоянии захватить правильное время с минимальными издержками.Вызов core.stdc.time занимает количество времени, примерно эквивалентное небольшому выделению памяти, поэтому это не очень хороший вариант.

  2. В идеале должен быть кроссплатформенным (как для ОС, так и для процессора),для простоты обслуживания.

  3. Сверхвысокое разрешение не очень важно.Если время с точностью до 1/4 секунды, этого вполне достаточно.

  4. Должен работать в многопоточном / многопроцессорном контексте.Инструкция x86 rdtsc не будет работать.

EDIT: простая старая функция C clock() кажется достаточно быстрой.Однако здесь переполнение является проблемой.В 32-разрядных Windows и Linux clock_t определяется как 32-разрядное целое число со знаком.Когда он переполняется, становится ли он отрицательным или функция clock() использует дополнительную логику, чтобы вместо этого обернуть ее в ноль?Если он обнуляется, то это сделает свое дело.Если он обнуляется (что также представляет коды ошибок и т. Д.), То он не будет работать.

Редактировать # 2: Я все равно попробовал эвристику, используя clock() и игнорируя проблему переполненияпросто как тест.Он работает так плохо, что не стоит дальше его изучать.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2011

Ну, первое, что я бы предложил, это использовать core.time или std.datetime.У него есть StopWatch.Разве это не достаточно быстро?Он использует все стандартные монотонные часы для системы, и я бы надеялся , что это будет достаточно быстро.Это, безусловно, самая высокая точность, которую вы собираетесь получить (хотя, как высокая точность влияет на скорость, я не знаю).Однако, если это не достаточно быстро, я совсем не уверен, что другие ваши варианты лучше.Как правило, вы получаете вторую точность или высокую точность.Там не так много междуИ с высокой точностью, как правило, это, по крайней мере, микросекундная точность, вопрос в том, насколько она выше.Точность в 1/4 секунды не совсем нормальная.

Предложение Cybershadow о clock может быть уловкой - конечно, это единственный вариант, который является стандартным C, насколько я знаю, - но этоможет или не может быть достаточно быстрым.

Помимо clock ... В Linux, если вы хотите немонотонный способ получить время с большей точностью, чем одна секунда, я считаю,что gettimeofday - ваш единственный реальный вариант, но я не знаю, насколько это быстро.В Windows лучшее немонотонное решение, о котором я знаю, это getSystemTimeAsFiletime , но в Windows есть несколько временных функций , с которыми можно поиграться.

Выможете взглянуть на Clock.currStdTime в std.datetime, чтобы узнать, как это сделать (хотя он использует clock_gettime в Posix, если он доступен, что и используется в core.time - хотя и с другими часами - так что вы, вероятно, захотите else часть этой функции для Linux, если StopWatch слишком медленная для вас).Однако он конвертируется в hnsecs с полуночи 1 января 1 года нашей эры, поэтому в зависимости от того, что вы делаете с числом, вы можете пропустить эту часть вычисления.

3 голосов
/ 22 февраля 2011

В идеале, для простоты обслуживания должен быть кроссплатформенным (как для ОС, так и для процессора).

Я думаю, это сводит вас к тому, что вы можете найти в стандартной библиотеке C.

Возможно Часы ?

...