All streams
Search
Write a publication
Pull to refresh
2
0
Andrew Vasilyev @retran

User

Send message
lair вообще повел себя как обиженный ребенок, которого уличили во лжи (неведении).


Все же хотелось бы услышать от специалиста ответы на эти глупые вопросы.
Сделайте одолжение, пожалуйста, потому что моих знаний, чтобы нагуглить что-то полезное не хватило.
Можно ведь открыть студию и убедиться, что поведение принципиально разное, а не показывать всем свою необразованность? А потом пойти и почитать почему оно разное.

Я вот на всякий случай сходил и проверил — gist.github.com/retran/9f4dc4c359d8e91d163e2452a642863c

Если вы так пишете код и считаете это переопределением — вас вообще на работу брать нельзя.
А я бы не взял вас. Потому что переопределение и сокрытие методов — это два сильно разных механизма и смешивать их нельзя ну вот совсем никак.
virtual в C# — это как раз те самые базовые принципы, увы.
Очень распространен и важен.
Человек который не может ответить на этот вопрос скорее всего не в курсе про полиморфизм и не сможет правильно его применять. Это уровень джуна, увы.
А вот это думаю зря, отчего не поправить, но это уже дело ваше.


Зачем тратить оплачиваемое время специалиста на обучение человека, который за свою карьеру/обучение не удосужился прочитать 1 (одну!!!!) несложную книжку? Зачем он вообще такой нужен? Знаете сколько таких ходит по собеседованиям и тратит чужое время?
Там не менее паршивый перевод очень паршивой статьи.
ConcurrentDictionary — внутри использует спиновые синхронизации.


Там совершенно обычные дотнетовские блокировки. Которые могут быть спиновыми.
Эк вы резко перепрыгнули с кэширования результата вычисления метода к обычному в общем-то синглтону на ридонли статик поле.

Я вот вообще-то думал, что мы задачу про мемоизацию функции решаем.

UPD Я вот считаю, что кэш без вытеснения — и не кэш вовсе. Поэтому о задаче кэширования в вашем случае вообще можно не говорить.
Под «достаточно одного T» имелось в виду, что у метода один дженерик параметр, а различных значений T пусть будет от 10 до 100.

В этот момент я заявляю, что вы страдаете херней и если у вас реально боттлнек в этом месте, то любой «паттерн» проиграет предзаполненному lookup table на Dictionary без блокировок вообще.
Там «либа Акиньшина» используется, она и так гоняет все в цикле много раз.
Вот, кстати, было бы интересно сравнить производительность мемоизации на статической переменной и на замыканиях.
Может быть, и могу. Но дело в том, что у меня такая позиция в программировании — испытывать на прочность самые неожиданные сценарии и варианты, а не ходить по проторенным и безопасным тропинкам. :)


Меня в институте учили, что испытание/эксперимент, это:
1. Подробное изучение всей доступной информации об объекте эксперимента.
2. Выдвижение четкой гипотезы, базирующейся на известной информации, а не на предположениях.
3. Разработка и проведение повторяемых экспериментов, в том числе опровергающих гипотезу.
Там таких случаев вагон по всему коду словаря.

Например:
github.com/Microsoft/referencesource/blob/60a4f8b853f60a424e36c7bf60f9b5b5f1973ed1/mscorlib/system/collections/generic/dictionary.cs#L463

Что будет, если до читающего потока доедет только одно из этих двух присвоений? volatile и барьеров я там не вижу.

Все гораздо проще. Вот максимально простой аналог того, что происходит у вас — gist.github.com/retran/fa8c6b6671f0c91091a986a22d0f528b
У вашего процессора несколько ядер, каждое со своим кэшом и своей личной копией кусочка памяти. Синхронизация кэшей происходит тоже кусочками и совсем не в том порядке, в котором вы что-то пишете в память. Соответственно, одно ядро может увидеть изменения в памяти не в том порядке, в котором они были сделаны другим ядром. Это если не учитывать ещё того, что компилятор может «немного» переписать ваш код и поменять порядок инструкций чтения/записи.
Хотя, справедливости ради, проверка на полное равенство ключей там тоже есть. Но это не отменяет того, что хэш-таблицы во время ресайза неконсистентна.
Только вот проблема с перерасчетом хэшей остаётся.
И мы ещё даже не начали за когерентность кэшей разговаривать.
Что произойдет при первом чтении по двум разным ключам «одновременно» из двух потоков?

Боттлнек на пустом месте, да.
Только вот корзина — это связный список на индексах. И все корзины лежат в одном массиве, а индексы у элементов меняются, причем перемещение элемента неатомарное и включает, кажется, с полдесятка операций записи и зависит не то чтобы от конкретного рантайма, а от конкретной его сборки.

Построить полную картину того, что может произойти при контеншне не берусь, там сотни вариантов с разным исходом, в том числе возврате любого произвольного элемента вместо null.

Самый простой вам ниже lair показал.

Information

Rating
Does not participate
Date of birth
Registered
Activity