Есть ли нераспределительный способ получить разницу между двумя точками LocalDateTime? - PullRequest
1 голос
/ 08 октября 2019

Я понимаю, почему различия между двумя экземплярами LocalDateTime выражаются в виде Periods, а не Durations, но я не смог найти причину, по которой Period является классом, а не структурой.

Я помогаю портировать кодовую базу, которая сделала много этого:

DateTime t1;
DateTime t2;
TimeSpan diff = t2-t1;


// After port, with a surprising allocation
LocalDateTime t1;
LocalDateTime t2;
Period diff = t2-t1;

Это похоже на ловушку perf / GC, и мне просто любопытно, почему Period - этокласс а не структура?

1 Ответ

2 голосов
/ 08 октября 2019

Основная причина, по которой Period является классом, заключается в том, что он будет огромным - он имеет 6 long полей и 4 int полей. Это будет 64 байта - это очень много для передачи в качестве аргумента метода и т. Д. Хотя некоторые другие структуры в Noda Time "довольно большие", они не , что большие.

Но этоСтоит отметить, что две части кода делают совершенно разные вещи. Время Noda, эквивалентное TimeSpan, не Period;это Duration, что является структурой. Если вам не нужен календарный расчет, вы можете рассмотреть возможность преобразования двух значений LocalDateTime в значения Instant в формате UTC (или избегать использования LocalDateTime для начала), а затем взять разницу между этими двумя моментами.

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

...