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[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[5]: TimeProvider
От: Философ Ад http://vk.com/id10256428
Дата: 13.04.23 06:20
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

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

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

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


Всё сказанное выше — личное мнение, если не указано обратное.
Re[6]: TimeProvider
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.04.23 06:30
Оценка: +2 -1
Здравствуйте, Философ, Вы писали:
Ф>В смысле!? Ты хочешь сказать, что если бы TimeProvider был интерфейсом, то ты бы мог свой треугольник сделать TimeProvider'ом — сделать реализацию это интерфейса? Типа так не получается — ты об этом?
Ф>Треугольник — это я конечно совсем загнул, но например стрим, или сервис.... Ты об этом, вот так?
Конечно. Я мог бы сделать свою реализацию ITimeProvider более-менее где угодно, в том числе и в классе, который реализует пачку провайдеров разных сервисов согласованным образом.
После введения default interface members польза от абстрактных классов в API упала до примерно нуля.
Это если вообще опираться на предположение, что методы тайм-провайдера сильно связаны между собой. В противном случае имело бы смысл отказаться и от интерфейса в пользу отдельных функций.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
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
От: _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[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[3]: TimeProvider
От: vdimas Россия  
Дата: 02.08.23 20:00
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

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


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

public TimeSpan GetElapsedTime (long startingTimestamp);


Собсно, это целевой метод, вокруг которого всё работает, он должен быть максимально легковесным, т.к. может вызываться в бесконечном цикле какого-нить диспетчера.
Re[5]: TimeProvider
От: vdimas Россия  
Дата: 02.08.23 20:11
Оценка:
Здравствуйте, Философ, Вы писали:

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

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

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

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

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


Он не более легковесный — точно такой же. Это разные счётчки: твой считает кол-во миллисекунд о старта системы, а то что ты хочешь заменить считает тики вроде-бы со 100 ns точностью.
Всё сказанное выше — личное мнение, если не указано обратное.
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
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.
Там надо было оперировать мгновенной частотой и это работало ненадёжно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.