|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Супер_ПавНазвание не важно было в приведенном примере. Вопрос был: "что вам не нравится в приведенном коде". Ответ: название метода не соответствует его действиям. Если бы было: "что вам не нравится, кроме названия", тогда ок ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 12:41 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
PallarisСупер_ПавНазвание не важно было в приведенном примере. Вопрос был: "что вам не нравится в приведенном коде". Ответ: название метода не соответствует его действиям. Если бы было: "что вам не нравится, кроме названия", тогда ок Я буквально сразу указал на то, что названия метода в данном вопросе не играет роли. Но почему-то особо тугие пытаются казаться очень умными. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 12:47 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Супер_ПавЯ буквально сразу указал на то, что названия метода в данном вопросе не играет роли. Ажно на второй странице. Ладно, пофиг тащемта ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 12:50 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Супер_Пававтор1) Что Вам не нравится в приведенном коде: Код: c# 1.
Инициализация поля на самом деле будет осуществлена в конструкторе. Компилятор, видя такой код, переместит код инициализации во все конструкторы. Если конструкторов не один, а много и если иницииализируемых полей много, то это приведёт к распуханию кода. Конечно, это не имеет значения, если конструктор всего один. Но в общем случае, как завещал Рихтер, следует код инициализации выносить в конструктор, инициализирующий поля по умолчанию. А потом вызывать его из всех других конструкторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 13:07 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
По поводу тормознутости ReaderWriterLockSlim не высказывался только ленивый. Уж сколько было тестов, замеров и бенчмарков, в которых наивный lock побивал его. Поэтому, имхо, работодатели не совсем правы, что это единственный вариант. Опять же, можно реализовать ручную блокировку (вернее, ожидание) на спинах, что будет быстрее лока (не всегда, но во многих случаях). Впрочем, это уже реализовано в ConcurrentDictionary, который тут уже предлагали. Вот в первую очередь его и взять. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 13:15 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
petalvikОпять же, можно реализовать ручную блокировку (вернее, ожидание) на спинах, что будет быстрее лока (не всегда, но во многих случаях). lock() реализован на Critical Section , это комбинация спинлока и мутекса. Поэтому чистые спины будут чуть быстрее пока работающих потоков не станет больше чем ядер. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 13:25 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Dima TpetalvikОпять же, можно реализовать ручную блокировку (вернее, ожидание) на спинах, что будет быстрее лока (не всегда, но во многих случаях). lock() реализован на Critical Section , это комбинация спинлока и мутекса. Поэтому чистые спины будут чуть быстрее пока работающих потоков не станет больше чем ядер. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 14:38 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
ЕвгенийВ, это к чему? Надо не IL-код смотреть, а реальную реализацию System.Threading.Monitor::Enter, какое WinAPI он вызывает. Не помню где я вычитал что критические секции используются, т.е. вызов EnterCriticalSection() Погуглил, возможно я ошибаюсь и тут просто игра слов, т.к. в документации критической секцией называют блок кода внутри lock() https://msdn.microsoft.com/ru-ru/library/system.threading.monitor(v=vs.110).aspx#CriticalSection The critical section Use the Enter and Exit methods to mark the beginning and end of a critical section. ... Не знаю можно ли считать достоверным источником, но вот что пишут https://stackoverflow.com/questions/14156349/critical-section-in-c-sharp Why you want to use WinAPI Critical section? In .NET there are class Monitor which encapsulates WinAPI Critical section – Hamlet Hakobyan ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 15:14 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Супер_Пав, не читал тред. 1 очевидно трайгетвалью, но метод(public Guid GetValue(stringkey)) сам по себе убог так как семантически предполагает обязательное возвращение значения, так что совсем тру - просто дикт[] и падать при отсутствии, заодно лямбдой запишешь. 2 все кроме конкарентдикта не жизненно, возможно хотели услышать ридер райтер лок, но ни разу не встречал в проде чтоб он обгонял обычный лок, так что или конкарентдикт, или, как говорил солист группы Бредер...:) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 16:34 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Dima T, Я тоже иногда вангую, но лучше прочитать документ из первых рук и посмотреть реальный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 16:36 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Супер_Пав...я не понял выгоды, чем 1й вариант, хуже 2го ну там скорее всего возвращался валю и выгода довольно очевидная, а в последнем шарпе еще и пишется симпатично. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 16:37 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
ЕвгенийВDima T, Я тоже иногда вангую, но лучше прочитать документ из первых рук и посмотреть реальный код. Собственно вот что там пишут авторMonitor is implemented as a "hybrid lock;" it has features of both a spin-lock and a kernel-based lock like a Mutex. The idea is that most locks are held only briefly, so it takes less time to simply spin-wait for the lock to be released, than it would to make a call into the kernel to block the thread. It is important not to waste CPU cycles spinning, so if the lock has not been acquired after a brief period of spinning, the implementation falls back to blocking in the kernel. Вот что пишут про критические секции https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682530(v=vs.85).aspx A thread uses the InitializeCriticalSectionAndSpinCount or SetCriticalSectionSpinCount function to specify a spin count for the critical section object. Spinning means that when a thread tries to acquire a critical section that is locked, the thread enters a loop, checks to see if the lock is released, and if the lock is not released, the thread goes to sleep. Тот же самый подход: некоторое количество спинлоков затем освобождение проца, если установить блокировку не удалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 17:06 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
PallarisСупер_ПавНазвание не важно было в приведенном примере. Вопрос был: "что вам не нравится в приведенном коде". Ответ: название метода не соответствует его действиям. Какие мелочи. А если метод назвать GetUniqueValue вам всё нравится? А если метод называется GetValue и принадлежит классу UniqueValueFactory ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 17:43 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
mikronА если метод назвать GetUniqueValue вам всё нравится? А если метод называется GetValue и принадлежит классу UniqueValueFactory ? 1. Нет 2. Нет ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 18:37 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
ЕвгенийВА что вам не нравиться в этом коде? Код: c# 1.
Я от него наоборот тащусь )) И чтобы два раза не вставать товарищу, который против сравнения с false, отвечу На мой взгляд восклицательный знак в начале очень легко не заметить, поэтому я пишу так ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 22:31 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
yabsНа мой взгляд восклицательный знак в начале очень легко не заметить, поэтому я пишу тактогда лайфхак: пиши !=true - так еще заметнее ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2017, 22:47 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
petalvikСупер_Павпропущено... Код: c# 1.
Инициализация поля на самом деле будет осуществлена в конструкторе. Компилятор, видя такой код, переместит код инициализации во все конструкторы. Если конструкторов не один, а много и если иницииализируемых полей много, то это приведёт к распуханию кода. Конечно, это не имеет значения, если конструктор всего один. Но в общем случае, как завещал Рихтер, следует код инициализации выносить в конструктор, инициализирующий поля по умолчанию. А потом вызывать его из всех других конструкторов.Отключать "инлайнинг" методов Рихтер тоже завещал? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 05:52 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
НахлобучМетод GetValue(), который модифицирует коллекцию -- вот, что должно не нравиться в этом коде +1 НахлобучНужно использовать ConcurrentDictionary +1, но он потормознее ИМХО варианта с lock Супер_ПавЕдинственное решение задачи - это класс ReaderWriterLockSlim Это будет верно только если а) многопоточные обращения к методу действительно интенсивные б) обращения в основном читающие, и изредка пишущие. В вашем случае одновременно проводится и чтение и запись, в таком случае lock по любому будет выстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 11:21 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Arm79+1, но он потормознее ИМХО варианта с lock Не заморачивались бы с ним тогда. Кстати ConcurrentDictionary использует lock внутри но лочит только часть данных, которые удовлетворяют значению хеша. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 11:51 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
if (condition == false), с точки зрения получаемого кода, после оптимизации, вряд ли будет чем то отличаться от if (!condition) Denis. все кроме конкарентдикта не жизненно, возможно хотели услышать ридер райтер лок, но ни разу не встречал в проде чтоб он обгонял обычный лок, так что или конкарентдикт, или, как говорил солист группы Бредер...:) всё зависит от задачи, если операции очень короткие, то будет медленее, если операции чтения и записи длительные, то будет лучше. этот как и с Parallels, далеко не всегда будет прирост, а если операция очень короткая, будет только тормознее. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 12:23 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Arm79НахлобучНужно использовать ConcurrentDictionary +1, но он потормознее ИМХО варианта с lock Я намерил в 2+ раза побыстрее 20543813 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 12:38 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Dima TArm79пропущено... +1, но он потормознее ИМХО варианта с lock Я намерил в 2+ раза побыстрее 20543813 Сценарии для ReaderWriterLockSlim - один пишет, 100500 читают! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 12:47 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
ЕвгенийВDima Tпропущено... Я намерил в 2+ раза побыстрее 20543813 Сценарии для ReaderWriterLockSlim - один пишет, 100500 читают! ReaderWriterLockSlim там тоже был в замере. Тормознее всех оказался. Проблема одной общей блокировки в том что идет постоянное перекидывание кэш-линии проца между разными ядрами, в итоге тормоза. Тут замерял 20429620 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 13:02 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Dima TArm79пропущено... +1, но он потормознее ИМХО варианта с lock Я намерил в 2+ раза побыстрее 20543813 ' Сколько там потоков для теста?)))) 100? Да, в условиях большого количества потоков по любому ConcurrentDictionary получше будет за счет снижения блокировок. Но там прикладная логика, которая будет неактуальна, когда потоков всего 2-3. Lock построен на критической секции, и в условиях отсутствия конкуренции за ресурсы практически ничего не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 14:17 |
|
Впечатления от собеседования (связано с .Net)
|
|||
---|---|---|---|
#18+
Arm79Dima Tпропущено... Я намерил в 2+ раза побыстрее 20543813 ' Сколько там потоков для теста?)))) 100? Да, в условиях большого количества потоков по любому ConcurrentDictionary получше будет за счет снижения блокировок. Но там прикладная логика, которая будет неактуальна, когда потоков всего 2-3. Lock построен на критической секции, и в условиях отсутствия конкуренции за ресурсы практически ничего не стоит. 3 потока. В исходник под спойлером можно было заглянуть Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 14:31 |
|
|
start [/forum/topic.php?fid=20&msg=39467791&tid=1399861]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 152ms |
0 / 0 |