Re: Имитация DateTime.Now
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.04.23 05:46
Оценка: 16 (3) +8
Здравствуйте, Философ, Вы писали:

Ф>Навеяно темой про имитацию окружения
Автор: Qulac
Дата: 02.04.23


Ф>Это даже не вопрос, а скорее побомбить: меня эта тема с DateTime.Now в своё время очень долго вымораживала.

Ф>Вот неужели нельзя было заранее подумать, что люди будут тесты писать??????!!!!!1111
Ф>Идиоты!!!!!
Этот вопрос не так давно обсуждался где-то в СВ.
Вкратце: идиоты не авторы FCL, а те, кто использует DateTime.Now в коде, который собираются тестировать.
Если у вас в бизнес-логике есть функция, поведение которой зависит от времени, то она должна быть детерминистической и время в неё должно передаваться параметром.
То есть не GetReportOnCurrentBalances(), а GetReportOnCurrentBalances(DateTime balanceDate).
По-хорошему эта функция и в данные сама лазить не должна; генерация отчёта должна принимать исходные данные и отдавать отчёт.

Тогда вы сможете все сложные вещи покрыть дешёвыми юнит-тестами.
А корректность клеевого кода, который как раз и делает вызов SendEmailWithAttachment(configuration.AdminEmail, $"Balances on {DateTime.Now}", GeneratePDFReport(GetBalancesData(DateTime.Now))), проверяется интеграционными тестами. Тут уже шанс словить ошибку мал (т.к. непротестированного кода очень мало), поэтому длинный цикл тестирования приемлем.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: TimeProvider
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.04.23 06:30
Оценка: +2 -1
Здравствуйте, Философ, Вы писали:
Ф>В смысле!? Ты хочешь сказать, что если бы TimeProvider был интерфейсом, то ты бы мог свой треугольник сделать TimeProvider'ом — сделать реализацию это интерфейса? Типа так не получается — ты об этом?
Ф>Треугольник — это я конечно совсем загнул, но например стрим, или сервис.... Ты об этом, вот так?
Конечно. Я мог бы сделать свою реализацию ITimeProvider более-менее где угодно, в том числе и в классе, который реализует пачку провайдеров разных сервисов согласованным образом.
После введения default interface members польза от абстрактных классов в API упала до примерно нуля.
Это если вообще опираться на предположение, что методы тайм-провайдера сильно связаны между собой. В противном случае имело бы смысл отказаться и от интерфейса в пользу отдельных функций.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: TimeProvider
От: Qbit86 Кипр
Дата: 11.04.23 14:49
Оценка: 14 (2)
Здравствуйте, Философ, Вы писали:

Ф>Это даже не вопрос, а скорее побомбить: меня эта тема с DateTime.Now в своё время очень долго вымораживала.


Microsoft добавили абстракцию TimeProvider в каком-то превью .NET 8: https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/TimeProvider.cs
И принимают его в некоторых своих API вроде CancellationTokenSource или PeriodicTimer.
Глаза у меня добрые, но рубашка — смирительная!
Имитация DateTime.Now
От: Философ Ад http://vk.com/id10256428
Дата: 11.04.23 14:25
Оценка: -2
Навеяно темой про имитацию окружения
Автор: Qulac
Дата: 02.04.23


Это даже не вопрос, а скорее побомбить: меня эта тема с DateTime.Now в своё время очень долго вымораживала.
Вот неужели нельзя было заранее подумать, что люди будут тесты писать??????!!!!!1111
Идиоты!!!!!

UPD: я понимаю, что те прикладные программисты, которые написали DateTime.Now должны были сами подумать о "ближних", но уже написали...
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 11.04.2023 14:32 Философ . Предыдущая версия . Еще …
Отредактировано 11.04.2023 14:29 Философ . Предыдущая версия .
Отредактировано 11.04.2023 14:28 Философ . Предыдущая версия .
Re: Имитация DateTime.Now
От: Osaka  
Дата: 11.04.23 15:47
Оценка: -1 :)
Ф>Это даже не вопрос, а скорее побомбить: меня эта тема с DateTime.Now в своё время очень долго вымораживала.
Ф>Вот неужели нельзя было заранее подумать, что люди будут тесты писать??????!!!!!1111
Ф>Идиоты!!!!!
Идиоты запрещают в отладочной виртуалке поменять дату?
Re[3]: TimeProvider
От: Sharov Россия  
Дата: 12.04.23 09:01
Оценка: +2
Здравствуйте, Ночной Смотрящий, Вы писали:

Q>>И принимают его в некоторых своих API вроде CancellationTokenSource или PeriodicTimer.

НС>Абстрактный класс как основа API в 2023 году?

В чем проблема?
Кодом людям нужно помогать!
Re[8]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 13.04.23 06:25
Оценка: -1 :)
Здравствуйте, yenik, Вы писали:

Y>Что-то ты сильно разволновался с утра, молюсь за твоё здоровье. Ты ж первый начал копипастить реализации.


Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: TimeProvider
От: _NN_ www.nemerleweb.com
Дата: 13.04.23 09:50
Оценка: 114 (1)
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Qbit86, Вы писали:


Q>>Microsoft добавили абстракцию TimeProvider в каком-то превью .NET 8: https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/TimeProvider.cs

Q>>И принимают его в некоторых своих API вроде CancellationTokenSource или PeriodicTimer.

НС>Абстрактный класс как основа API в 2023 году?


Как раз в обсуждениях был задан этот вопрос: Why dotnet team prefers abstract classes over interfaces?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Имитация DateTime.Now
От: vmpire Россия  
Дата: 11.04.23 16:03
Оценка: +1
Здравствуйте, Философ, Вы писали:

Ф>Навеяно темой про имитацию окружения
Автор: Qulac
Дата: 02.04.23

Ф>Это даже не вопрос, а скорее побомбить: меня эта тема с DateTime.Now в своё время очень долго вымораживала.
Ф>Вот неужели нельзя было заранее подумать, что люди будут тесты писать??????!!!!!1111
Ф>Идиоты!!!!!
Для эстетов есть Microsoft Fakes
https://learn.microsoft.com/en-us/visualstudio/test/isolating-code-under-test-with-microsoft-fakes?view=vs-2022&tabs=csharp
По ссылке как раз пример с подменой DateTime.Now
Но только за деньги (только Enterprise версия).

А по хорошему нужно изолировать недетерменированные методы в самом приложении.
Отредактировано 11.04.2023 16:04 vmpire . Предыдущая версия .
Re[2]: TimeProvider
От: Ночной Смотрящий Россия  
Дата: 12.04.23 06:30
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>Microsoft добавили абстракцию TimeProvider в каком-то превью .NET 8: https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/TimeProvider.cs

Q>И принимают его в некоторых своих API вроде CancellationTokenSource или PeriodicTimer.

Абстрактный класс как основа API в 2023 году?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: TimeProvider
От: · Великобритания  
Дата: 12.04.23 17:06
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

Q>>Microsoft добавили абстракцию TimeProvider в каком-то превью .NET 8: https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/TimeProvider.cs

Q>>И принимают его в некоторых своих API вроде CancellationTokenSource или PeriodicTimer.
НС>Абстрактный класс как основа API в 2023 году?
Хуже, что они в один класс упихали часы, перформанс тайм-стампы, да ещё и таймер. При этом нет вменяемой возможности сделать часы в заданной таймзоне.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: TimeProvider
От: yenik  
Дата: 13.04.23 06:19
Оценка: -1
Ф>>>А вот сделать часы в заданной таймзоне есть:
Ф>>>Вот этот метод
Ф>>>
Ф>>> public virtual TimeZoneInfo LocalTimeZone { get => TimeZoneInfo.Local; }
Ф>>>

Ф>>>плюс вот этот

Ф>>>
Ф>>> public DateTimeOffset GetLocalNow()
Ф>>> {
Ф>>> DateTimeOffset utcDateTime = GetUtcNow();
Ф>>> TimeZoneInfo zoneInfo = LocalTimeZone;
Ф>>>

Ф>>>дают нам часы в любой таймзоне.

Y>>В каком смысле в любой?
Y>>https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.local?view=net-7.0
Y>>

Y>>The local time zone is the time zone on the computer where the code is executing.

Y>>Это не любая.

Ф>Блин, что за хрень!? Разговор про виртуальные методы одного класса (!абстрактного), а ты копипастишь описание СТАТИЧЕСКОГО свойства другого класса. WTF!?

Ф>Ну это же не политика, блин, это другой раздел — меру то нужно знать!

Что-то ты сильно разволновался с утра, молюсь за твоё здоровье. Ты ж первый начал копипастить реализации.
Re[7]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 13.04.23 06:34
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Конечно. Я мог бы сделать свою реализацию ITimeProvider более-менее где угодно, в том числе и в классе, который реализует пачку провайдеров разных сервисов согласованным образом.


Это нарушение SRP
Всё сказанное выше — личное мнение, если не указано обратное.
Re[7]: TimeProvider
От: · Великобритания  
Дата: 13.04.23 07:00
Оценка: +1
Здравствуйте, Философ, Вы писали:

Ф>·>Так это надо наследника писать и переопределять метод.

Ф>И в чём проблема? А как ты хотел?
Через setter, wither или конструктор.
Представь себе у тебя есть инстанс timeProvider и тебе нужно получить такой же, но в другой таймзоне. Придётся писать наследника-делегата с переопределением одного метода.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: TimeProvider
От: vdimas Россия  
Дата: 02.08.23 20:00
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Абстрактный класс как основа API в 2023 году?


Это ради невиртуального:

public TimeSpan GetElapsedTime (long startingTimestamp);


Собсно, это целевой метод, вокруг которого всё работает, он должен быть максимально легковесным, т.к. может вызываться в бесконечном цикле какого-нить диспетчера.
Re[6]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 03.08.23 04:41
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Можно переопределить на более легковесный Environment.TickCount


Он не более легковесный — точно такой же. Это разные счётчки: твой считает кол-во миллисекунд о старта системы, а то что ты хочешь заменить считает тики вроде-бы со 100 ns точностью.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[11]: TimeProvider
От: vdimas Россия  
Дата: 03.08.23 19:02
Оценка: -1
Здравствуйте, rudzuk, Вы писали:

R>

The frequency of the performance counter is fixed at system boot and is consistent across all processors. Therefore, the frequency need only be queried upon application initialization, and the result can be cached.

R>(c)

Ты вырезал из контекста, где речь шла про непосредственный опрос RDTSC.
Там надо было оперировать мгновенной частотой и это работало ненадёжно.
Re: Имитация DateTime.Now
От: yenik  
Дата: 11.04.23 17:28
Оценка:
Выглядит как бан в Гугле.

https://anthonygiretti.com/2020/02/04/tips-tricks-for-unit-testing-in-net-core-3-using-and-mocking-isystemclock-instead-of-using-datetime/
Re: Имитация DateTime.Now
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.04.23 00:41
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Это даже не вопрос, а скорее побомбить: меня эта тема с DateTime.Now в своё время очень долго вымораживала.

Ф>Вот неужели нельзя было заранее подумать, что люди будут тесты писать??????!!!!!1111
Ф>Идиоты!!!!!

Тут есть одна проблема. DateTime.Now не единственный источник времени в системе. У нас, например, в продукте кроме дотнетного гуя еще серверная плюсовая часть есть. Так что если бы можно было подменить DateTime.Now — это нас не спасло бы. В тестах используется классец который переводит время и возвращает его обратно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Имитация DateTime.Now
От: Философ Ад http://vk.com/id10256428
Дата: 12.04.23 05:59
Оценка:
Здравствуйте, yenik, Вы писали:

Y>Выглядит как бан в Гугле.


Так выглядит узкий кругозор.
Когда я работал над тем проектом, там поддерживалась Win2k3. Поэтому .net 4.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: Имитация DateTime.Now
От: yenik  
Дата: 12.04.23 06:12
Оценка:
Ф>Когда я работал над тем проектом, там поддерживалась Win2k3. Поэтому .net 4.

Понятно. Уже как-то забываешь, что люди с FW до сих пор работают.
А с Core — ISystemClock. Хотя тоже необязательно. Я ещё просто делаю IDateTimeService, а в нём все нужные методы для работы с датой/временем. И DateTime.Now или UtcNow никогда в проекте напрямую не использую. Таким образом и в юнит-тестах всё с лёгкостью мокается.
А внутри реализации IDateTimeService можно или ISystemClock использовать, или DateTime.UtcNow напрямую. Поскольку инкапсулировано, это уже неважно.
И кстати местный часовой пояс лучше не из компьютера брать, а явно в конфигурации прописывать, а в DateTimeService уже все нужные преобразования реализовать. За основу всегда брать UTC.
Это для веб-сайтов. Для десктопа наверно лучше часовой пояс из компьютера.
Я думал ещё внедрить Noda Time
Автор: yenik
Дата: 11.03.23
, но боюсь, дикари-с, не поймут-с.
Отредактировано 12.04.2023 7:24 yenik . Предыдущая версия . Еще …
Отредактировано 12.04.2023 7:23 yenik . Предыдущая версия .
Re[4]: TimeProvider
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.04.23 16:15
Оценка:
Здравствуйте, Sharov, Вы писали:
S>В чем проблема?
В ограничениях на иерархию наследования.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: TimeProvider
От: Sharov Россия  
Дата: 12.04.23 17:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>В чем проблема?

S>В ограничениях на иерархию наследования.

Ну а как до этого с этими ограничениями жили?
Кодом людям нужно помогать!
Re[6]: TimeProvider
От: Ночной Смотрящий Россия  
Дата: 12.04.23 19:29
Оценка:
Здравствуйте, Sharov, Вы писали:

S>>В ограничениях на иерархию наследования.

S>Ну а как до этого с этими ограничениями жили?

Некоторые до сих пор удобствами во дворе пользуются, но это же не повод в современном доме отказываться от канализации.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 12.04.23 19:38
Оценка:
Здравствуйте, ·, Вы писали:

·>Хуже, что они в один класс упихали часы, перформанс тайм-стампы, да ещё и таймер. При этом нет вменяемой возможности сделать часы в заданной таймзоне.


Там вот это ппц — ппц.
public virtual long GetTimestamp() => Stopwatch.GetTimestamp();

Просто чудовищные грабли.

А вот сделать часы в заданной таймзоне есть:
Вот этот метод
    public virtual TimeZoneInfo LocalTimeZone { get => TimeZoneInfo.Local; }

плюс вот этот
        public DateTimeOffset GetLocalNow()
        {
            DateTimeOffset utcDateTime = GetUtcNow();
            TimeZoneInfo zoneInfo = LocalTimeZone;

дают нам часы в любой таймзоне.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[5]: TimeProvider
От: · Великобритания  
Дата: 12.04.23 19:51
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>А вот сделать часы в заданной таймзоне есть:

Ф>Вот этот метод
Ф>
Ф>    public virtual TimeZoneInfo LocalTimeZone { get => TimeZoneInfo.Local; }
Ф>

Ф>дают нам часы в любой таймзоне.
Так это надо наследника писать и переопределять метод.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 12.04.23 23:31
Оценка:
Здравствуйте, ·, Вы писали:

·>Так это надо наследника писать и переопределять метод.


И в чём проблема? А как ты хотел?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[6]: TimeProvider
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.04.23 01:11
Оценка:
Здравствуйте, Sharov, Вы писали:
S>Ну а как до этого с этими ограничениями жили?
Плохо жили.
А в тех местах, где этих ограничений не вводили, жили хорошо.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: TimeProvider
От: yenik  
Дата: 13.04.23 05:54
Оценка:
Ф>·>Хуже, что они в один класс упихали часы, перформанс тайм-стампы, да ещё и таймер. При этом нет вменяемой возможности сделать часы в заданной таймзоне.

Ф>А вот сделать часы в заданной таймзоне есть:

Ф>Вот этот метод
Ф>
Ф>    public virtual TimeZoneInfo LocalTimeZone { get => TimeZoneInfo.Local; }
Ф>

Ф>плюс вот этот
Ф>
Ф>        public DateTimeOffset GetLocalNow()
Ф>        {
Ф>            DateTimeOffset utcDateTime = GetUtcNow();
Ф>            TimeZoneInfo zoneInfo = LocalTimeZone;
Ф>

Ф>дают нам часы в любой таймзоне.

В каком смысле в любой?
https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.local?view=net-7.0

The local time zone is the time zone on the computer where the code is executing.

Это не любая.
Re[6]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 13.04.23 06:14
Оценка:
Здравствуйте, yenik, Вы писали:

Y>В каком смысле в любой?

Y>https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.local?view=net-7.0
Y>

Y>The local time zone is the time zone on the computer where the code is executing.

Y>Это не любая.

Блин, что за хрень!? Разговор про виртуальные методы одного класса (!абстрактного), а ты копипастишь описание СТАТИЧЕСКОГО свойства другого класса. WTF!?
Ну это же не политика, блин, это другой раздел — меру то нужно знать!
Всё сказанное выше — личное мнение, если не указано обратное.
Re[5]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 13.04.23 06:20
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Sharov, Вы писали:

S>>В чем проблема?
S>В ограничениях на иерархию наследования.

В смысле!? Ты хочешь сказать, что если бы TimeProvider был интерфейсом, то ты бы мог свой треугольник сделать TimeProvider'ом — сделать реализацию это интерфейса? Типа так не получается — ты об этом?
Треугольник — это я конечно совсем загнул, но например стрим, или сервис.... Ты об этом, вот так?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[8]: TimeProvider
От: · Великобритания  
Дата: 13.04.23 10:14
Оценка:
Здравствуйте, ·, Вы писали:

Ф>>·>Так это надо наследника писать и переопределять метод.

Ф>>И в чём проблема? А как ты хотел?
·>Через setter, wither или конструктор.
·>Представь себе у тебя есть инстанс timeProvider и тебе нужно получить такой же, но в другой таймзоне. Придётся писать наследника-делегата с переопределением одного метода.
А с учётом этого, когда они добавят очередной виртуальнй метод в своё поделие, твой делегат по тихому сломается, будет делегировать всё, кроме этого нового метода.
Ну не умеют в микрософте вменяемый api делать, лучше бы тупо с явы передирали, и то бы лучше получалось.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: TimeProvider
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.04.23 10:27
Оценка:
Здравствуйте, Философ, Вы писали:
Ф>Это нарушение SRP
Нет, не нарушение. Иначе любой класс, реализующий более 1 интерфейса, нарушал бы SRP.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: TimeProvider
От: vdimas Россия  
Дата: 02.08.23 20:11
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Там вот это ппц — ппц.

Ф>
Ф>public virtual long GetTimestamp() => Stopwatch.GetTimestamp();
Ф>

Ф>Просто чудовищные грабли.

Можно переопределить на более легковесный Environment.TickCount
Re[7]: TimeProvider
От: vdimas Россия  
Дата: 03.08.23 12:04
Оценка:
Здравствуйте, Философ, Вы писали:

V>>Можно переопределить на более легковесный Environment.TickCount

Ф>Он не более легковесный — точно такой же.

В разы более легковесный.


Ф>Это разные счётчки: твой считает кол-во миллисекунд о старта системы


GetTickCount64 — это просто чтение кешированной переменной, значение которой обновляется каждый раз при срабатывании системного таймера.


Ф>а то что ты хочешь заменить считает тики вроде-бы со 100 ns точностью.


А тут каждый раз считывается значение с аппаратного таймера и это дороже в несколько раз.

В общем, первый способ имеет низкую разрешающую способность, но дешевый.
Второй способ имеет лучшую разрешающую способность, но дорогой. ))
Re[8]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 03.08.23 12:49
Оценка:
Здравствуйте, vdimas, Вы писали:

V>GetTickCount64 — это просто чтение кешированной переменной, значение которой обновляется каждый раз при срабатывании системного таймера.


В случае Stopwatch.GetTimestamp() даже записи в переменную может не быть.

V>В общем, первый способ имеет низкую разрешающую способность, но дешевый.

V>Второй способ имеет лучшую разрешающую способность, но дорогой. ))

В абсолютном большинстве случаев он столь же дешёвый, если не дешевле: за кадром выполняется команда RDTSC, которая копирует содержимое MSR в EDX:EAX — обращение к памяти не происходит. А MSR обновляется сам, всегда.
Такое поведение в абсолютном большинстве случаев. Иное — если недоступна RDTSC, то такого на практике под виндой ни у кого пока не было (ни у кого из миллиардов пользователей). Иное поведение может быть, если винда принудительно настроена на использование HPET.
Если недоступны HPET и RDTS, то будет использован тот же таймер что ты предлагаешь, с соответствующей точностью.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 03.08.2023 12:52 Философ . Предыдущая версия .
Re[9]: TimeProvider
От: vdimas Россия  
Дата: 03.08.23 16:35
Оценка:
Здравствуйте, Философ, Вы писали:

V>>GetTickCount64 — это просто чтение кешированной переменной, значение которой обновляется каждый раз при срабатывании системного таймера.

Ф>В случае Stopwatch.GetTimestamp() даже записи в переменную может не быть.

Это всё-равно в разы дороже.
Просто замерь и убедись.


V>>Второй способ имеет лучшую разрешающую способность, но дорогой. ))

Ф>В абсолютном большинстве случаев он столь же дешёвый, если не дешевле: за кадром выполняется команда RDTSC, которая копирует содержимое MSR в EDX:EAX — обращение к памяти не происходит.

Ой, блин, из глаз кровь читать эту чушь.
Это вызов ф-ии АПИ QueryPerformanceCounter, которая вызывает драйвер через KeQueryPerformanceCounter, а драйвер зависит от проца/чипсета, бо входу еще процы, где RDTSC возвращала разные значения для каждого ядра и это длилось почти десятилетие, такой беспредел. Плюс требуется запрашивать QueryPerformanceFrequency, а она у процов тоже гуляла постоянно.

Чтобы избежать ошибок и проблем с переносимостью, настоятельно рекомендуется использовать QPC вместо регистра TSC или инструкций процессора RDTSC или RDTSCP .


У старых чипсетов в итоге дойдёт до RDTSC — а пока дойдёт это уже дорого, и еще привет кучи багов, с которыми не раз боролся, когда таймстэмп надо было из разных потоков отмечать.


Ф>Такое поведение в абсолютном большинстве случаев.


Если дрова на чипсет нашлись — будет поставлено устройство high precision event timer.

В общем, не спорьте.
Если охота брать дешевое время — это GetTickCount64.
Re[10]: TimeProvider
От: rudzuk  
Дата: 03.08.23 18:44
Оценка:
Здравствуйте, vdimas, Вы писали:

v> Ой, блин, из глаз кровь читать эту чушь.

v> Плюс требуется запрашивать QueryPerformanceFrequency, а она у процов тоже гуляла постоянно.

А чушь писать ничего не кровоточит?

The frequency of the performance counter is fixed at system boot and is consistent across all processors. Therefore, the frequency need only be queried upon application initialization, and the result can be cached.

(c)
avalon/3.0.2
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.