И будет у меня бенчмарк операции длиной 5мс, а не механизма "синхронизации".
Сейчас накладные в наносекундах, и их "съест" дополнительная логика в 5мс.
В любом случае, вы написали статью о том что стандартные механизмы синхронизации плохи и всё с ними грустно, но по факту - всё с ними хорошо, насколько я вижу.
Код с локом ожидаемо работает и довольно шустро (т.к. линейный подход в один поток), а ваш код оказывается возвращает управление не выполнив работу, и мой метод Assert валится с разным числом выполненых обработчиков.
Поэтому я ещё раз прошу - дайте конкретные примеры, какой код какому коду соответствует, чтобы было понятно, что на что можно заменять.
В текущем виде синхронная реализация некорректна и использовать её нельзя.
ПС: асинхронную\многопоточную без понятия как измерять, т.к. оно будет зависеть от очень большого числа случайных переменных на ПК.
Так а новость то о чём? Новость о том, что леста готова переносить свои игры на "платформы" новые. Но даже под линукс с макосью нет официальной поддержки. Под консоли есть, но там по моему другой продукт физически, т.е. не та же самая игра.
Вызов dbContext.Models.FirstOrDefault синхронный же. По моему верно написано - текущий поток будет отпущен, а вот поток внутри Task.Run - синхронно ждёт.
И будет у меня бенчмарк операции длиной 5мс, а не механизма "синхронизации".
Сейчас накладные в наносекундах, и их "съест" дополнительная логика в 5мс.
В любом случае, вы написали статью о том что стандартные механизмы синхронизации плохи и всё с ними грустно, но по факту - всё с ними хорошо, насколько я вижу.
По ссылке выше ( https://gist.github.com/MonkAlex/3ee81313728b3b7227a8a223f64973c3 ) я ошибся вызовом. Когда сделал синхронный вызов, удалось померять производительность, результаты по ссылке приложил - лок работает быстрее.
По вашему примеру в статье попытался сделать вот такое https://gist.github.com/MonkAlex/f9df69aa26ae06896aa374563896dba0
Результаты по ссылке тоже приложил, лок опять быстрее, примерно на порядок.
Вы живой человек или чатгпт?
Я прошу примеры, вы говорите "вот примеры".
Я пытаюсь ими пользоваться - вы говорите, так нельзя, в этом нет смысла.
В чём есть смысл то? Когда мне нужен ваш код, в каких сценариях использования?
ПС: ваши бенчи я не понял, поэтому и задаю вопросы.
Так, я решил попробовать синхронный вариант, взял https://raw.githubusercontent.com/gentlee/SerialQueue/master/SerialQueue/SerialQueue.cs
Накидал вот такой код (с использованием библиотеки BenchmarkDotNet, чтобы посчитать эффективность хотя бы линейного использования)
https://gist.github.com/MonkAlex/3ee81313728b3b7227a8a223f64973c3
Код с локом ожидаемо работает и довольно шустро (т.к. линейный подход в один поток), а ваш код оказывается возвращает управление не выполнив работу, и мой метод Assert валится с разным числом выполненых обработчиков.
Поэтому я ещё раз прошу - дайте конкретные примеры, какой код какому коду соответствует, чтобы было понятно, что на что можно заменять.
В текущем виде синхронная реализация некорректна и использовать её нельзя.
ПС: асинхронную\многопоточную без понятия как измерять, т.к. оно будет зависеть от очень большого числа случайных переменных на ПК.
Я может мысли плохо свои выражаю, но я хочу видеть код "до" применения вашей библиотеки.
Какой у меня в приложении должен быть код, чтобы ваша библиотека решала мою "проблему"?
Слона в вакууме обсуждаем, я просил у вас примеры кода "до" и "после", но ни одного примера так и не увидел.
Кейс нужен, чтобы понять что на что заменяется. И вот это уже можно мерять и оценивать.
Почему память то?
Условно в очередь я добавляю по 1000 элементов в секунду, а разгребаю по 10.
Это тоже переполнение.
Как пирамида не работает, так и ваша схема - не работает.
Так а новость то о чём? Новость о том, что леста готова переносить свои игры на "платформы" новые. Но даже под линукс с макосью нет официальной поддержки. Под консоли есть, но там по моему другой продукт физически, т.е. не та же самая игра.
Просто вот взяли, нажали на офф-сайте "скачать" и установили? Нет же?
Во первых им занималась варгейминг, а не леста.
Во вторых - танки как основной продукт - не работают нативно под линуксом.
Ну, если там будет виндовс - то да, они готовы. В остальных случаях я сомневаюсь.
Ну вот я открыл https://github.com/gentlee/SerialQueue/blob/master/Benchmark/SerialQueueTasksMonitor.cs
Какой пример кода оно заменяет?
Я вижу Task.Run, обернутый в lock, зачем - непонятно. Никаких проблем, решаемых таким подходом, я не знаю.
Тем что это Task.Run, но не на тредпуле, а на одном треде, внутри нельзя делать Task.Run, получим дедлок.
Я так понял ридми, возможно ошибаюсь.
Отдельно про SO и минус на нём - вам вполне корректно указали, что ваше решение не вписывает в SO, нужен реальный код, а не ссылка на либу.
Ваши бенчмарки для меня выглядят сложными и неочевидными, я не уверен, что именно вы меряли.
Хотелось бы увидеть пример кода (более-менее реального) с примитивом синхронизации и ваш способ его заменить вашей библиотекой.
ЯННП
Открываю https://github.com/gentlee/SerialQueue
Смотрю ридми
Там примеры кода, по которым я бы сказал что это аналог Task.Run
Где синхронизация?
Хороший вопрос, у меня нет на него ответа. У меня пароли и TOTP в одной базе кипаса, так что вместе утекут, если что.
В парольном менеджере, т.к. по ключу можно генерировать коды и вся безопасность улетучивается в трубу.
А тогда уж можно использовать KeePassXC, в котором есть и возможность работать с TOTP.
Вызов
dbContext.Models.FirstOrDefault
синхронный же. По моему верно написано - текущий поток будет отпущен, а вот поток внутри Task.Run - синхронно ждёт.Не уверен, что правильно понял.
Можно сделать абстрактный класс без абстрактных методов и свойств.
Такой класс нельзя будет создавать (через new по крайней мере), что потребует явно объявить наследник для использования.
А вот если в обычный класс воткнуть абстрактный метод - да, класс придётся тоже объявить абстрактным.
Так что вроде в целом текст логически верный.