powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Впечатления от собеседования (связано с .Net)
25 сообщений из 83, страница 3 из 4
Впечатления от собеседования (связано с .Net)
    #39467756
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_ПавНазвание не важно было в приведенном примере.

Вопрос был: "что вам не нравится в приведенном коде".
Ответ: название метода не соответствует его действиям.

Если бы было: "что вам не нравится, кроме названия", тогда ок
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467766
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisСупер_ПавНазвание не важно было в приведенном примере.

Вопрос был: "что вам не нравится в приведенном коде".
Ответ: название метода не соответствует его действиям.

Если бы было: "что вам не нравится, кроме названия", тогда ок
Я буквально сразу указал на то, что названия метода в данном вопросе не играет роли. Но почему-то особо тугие пытаются казаться очень умными.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467769
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_ПавЯ буквально сразу указал на то, что названия метода в данном вопросе не играет роли.

Ажно на второй странице. Ладно, пофиг тащемта
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467791
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пававтор1) Что Вам не нравится в приведенном коде:
Код: c#
1.
private readonly Dictionary<string, Guid> dict = new Dictionary<string, Guid>();




Инициализация поля на самом деле будет осуществлена в конструкторе. Компилятор, видя такой код, переместит код инициализации во все конструкторы. Если конструкторов не один, а много и если иницииализируемых полей много, то это приведёт к распуханию кода.

Конечно, это не имеет значения, если конструктор всего один. Но в общем случае, как завещал Рихтер, следует код инициализации выносить в конструктор, инициализирующий поля по умолчанию. А потом вызывать его из всех других конструкторов.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467802
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу тормознутости ReaderWriterLockSlim не высказывался только ленивый. Уж сколько было тестов, замеров и бенчмарков, в которых наивный lock побивал его. Поэтому, имхо, работодатели не совсем правы, что это единственный вариант.

Опять же, можно реализовать ручную блокировку (вернее, ожидание) на спинах, что будет быстрее лока (не всегда, но во многих случаях). Впрочем, это уже реализовано в ConcurrentDictionary, который тут уже предлагали. Вот в первую очередь его и взять.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467814
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikОпять же, можно реализовать ручную блокировку (вернее, ожидание) на спинах, что будет быстрее лока (не всегда, но во многих случаях).
lock() реализован на Critical Section , это комбинация спинлока и мутекса. Поэтому чистые спины будут чуть быстрее пока работающих потоков не станет больше чем ядер.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467861
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TpetalvikОпять же, можно реализовать ручную блокировку (вернее, ожидание) на спинах, что будет быстрее лока (не всегда, но во многих случаях).
lock() реализован на Critical Section , это комбинация спинлока и мутекса. Поэтому чистые спины будут чуть быстрее пока работающих потоков не станет больше чем ядер.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   public class BI 
    {
        static object Locker = new object();
        public BI() 
        {
 
        }
        public double Sin()
        {
            lock(Locker)
            {
                return Math.Sin(12.3);
            }
        }
    }


Код: 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.
.method public hidebysig 
	instance float64 Sin () cil managed 
{
	// Method begins at RVA 0x2484
	// Code size 55 (0x37)
	.maxstack 2
	.locals init (
		[0] bool '<>s__LockTaken0',
		[1] float64 CS$1$0000,
		[2] object CS$2$0001,
		[3] bool CS$4$0002
	)

	IL_0000: nop
	IL_0001: ldc.i4.0
	IL_0002: stloc.0
	.try
	{
		IL_0003: ldsfld object Test.BI::Locker
		IL_0008: dup
		IL_0009: stloc.2
		IL_000a: ldloca.s '<>s__LockTaken0'
		IL_000c: call void [mscorlib]System.Threading.Monitor::Enter(object, bool&)
		IL_0011: nop
		IL_0012: nop
		IL_0013: ldc.r8 12.3
		IL_001c: call float64 [mscorlib]System.Math::Sin(float64)
		IL_0021: stloc.1
		IL_0022: leave.s IL_0034
	} // end .try
	finally
	{
		IL_0024: ldloc.0
		IL_0025: ldc.i4.0
		IL_0026: ceq
		IL_0028: stloc.3
		IL_0029: ldloc.3
		IL_002a: brtrue.s IL_0033

		IL_002c: ldloc.2
		IL_002d: call void [mscorlib]System.Threading.Monitor::Exit(object)
		IL_0032: nop

		IL_0033: endfinally
	} // end handler

	IL_0034: nop
	IL_0035: ldloc.1
	IL_0036: ret
} // end of method BI::Sin
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467901
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ, это к чему?

Надо не 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
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467992
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,
не читал тред.
1 очевидно трайгетвалью, но метод(public Guid GetValue(stringkey)) сам по себе убог так как семантически предполагает обязательное возвращение значения, так что совсем тру - просто дикт[] и падать при отсутствии, заодно лямбдой запишешь.
2 все кроме конкарентдикта не жизненно, возможно хотели услышать ридер райтер лок, но ни разу не встречал в проде чтоб он обгонял обычный лок, так что или конкарентдикт, или, как говорил солист группы Бредер...:)
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467995
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Я тоже иногда вангую, но лучше прочитать документ из первых рук и посмотреть реальный код.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39467996
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав...я не понял выгоды, чем 1й вариант, хуже 2го
ну там скорее всего возвращался валю и выгода довольно очевидная, а в последнем шарпе еще и пишется симпатично.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468030
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ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.
Тот же самый подход: некоторое количество спинлоков затем освобождение проца, если установить блокировку не удалось.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468071
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisСупер_ПавНазвание не важно было в приведенном примере.

Вопрос был: "что вам не нравится в приведенном коде".
Ответ: название метода не соответствует его действиям.

Какие мелочи.

А если метод назвать GetUniqueValue вам всё нравится?
А если метод называется GetValue и принадлежит классу UniqueValueFactory ?
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468118
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronА если метод назвать GetUniqueValue вам всё нравится?
А если метод называется GetValue и принадлежит классу UniqueValueFactory ?

1. Нет
2. Нет
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468213
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВА что вам не нравиться в этом коде?
Код: c#
1.
 if (dict.TryGetValue(key, out value) == false)


Я от него наоборот тащусь ))

И чтобы два раза не вставать товарищу, который против сравнения с false, отвечу
На мой взгляд восклицательный знак в начале очень легко не заметить, поэтому я пишу так
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468219
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsНа мой взгляд восклицательный знак в начале очень легко не заметить, поэтому я пишу тактогда лайфхак: пиши !=true - так еще заметнее
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468261
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikСупер_Павпропущено...

Код: c#
1.
private readonly Dictionary<string, Guid> dict = new Dictionary<string, Guid>();




Инициализация поля на самом деле будет осуществлена в конструкторе. Компилятор, видя такой код, переместит код инициализации во все конструкторы. Если конструкторов не один, а много и если иницииализируемых полей много, то это приведёт к распуханию кода.

Конечно, это не имеет значения, если конструктор всего один. Но в общем случае, как завещал Рихтер, следует код инициализации выносить в конструктор, инициализирующий поля по умолчанию. А потом вызывать его из всех других конструкторов.Отключать "инлайнинг" методов Рихтер тоже завещал?
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468425
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучМетод GetValue(), который модифицирует коллекцию -- вот, что должно не нравиться в этом коде
+1


НахлобучНужно использовать ConcurrentDictionary
+1, но он потормознее ИМХО варианта с lock

Супер_ПавЕдинственное решение задачи - это класс ReaderWriterLockSlim
Это будет верно только если а) многопоточные обращения к методу действительно интенсивные б) обращения в основном читающие, и изредка пишущие.
В вашем случае одновременно проводится и чтение и запись, в таком случае lock по любому будет выстрее
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468459
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79+1, но он потормознее ИМХО варианта с lock

Не заморачивались бы с ним тогда. Кстати ConcurrentDictionary использует lock внутри но лочит только часть данных, которые удовлетворяют значению хеша.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468500
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
if (condition == false), с точки зрения получаемого кода, после оптимизации, вряд ли будет чем то отличаться от if (!condition)

Denis. все кроме конкарентдикта не жизненно, возможно хотели услышать ридер райтер лок, но ни разу не встречал в проде чтоб он обгонял обычный лок, так что или конкарентдикт, или, как говорил солист группы Бредер...:)
всё зависит от задачи, если операции очень короткие, то будет медленее, если операции чтения и записи длительные, то будет лучше.
этот как и с Parallels, далеко не всегда будет прирост, а если операция очень короткая, будет только тормознее.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468523
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79НахлобучНужно использовать ConcurrentDictionary
+1, но он потормознее ИМХО варианта с lock
Я намерил в 2+ раза побыстрее 20543813
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468530
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TArm79пропущено...

+1, но он потормознее ИМХО варианта с lock
Я намерил в 2+ раза побыстрее 20543813
Сценарии для ReaderWriterLockSlim - один пишет, 100500 читают!
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468548
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВDima Tпропущено...

Я намерил в 2+ раза побыстрее 20543813
Сценарии для ReaderWriterLockSlim - один пишет, 100500 читают!
ReaderWriterLockSlim там тоже был в замере. Тормознее всех оказался.

Проблема одной общей блокировки в том что идет постоянное перекидывание кэш-линии проца между разными ядрами, в итоге тормоза. Тут замерял 20429620
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468649
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TArm79пропущено...

+1, но он потормознее ИМХО варианта с lock
Я намерил в 2+ раза побыстрее 20543813 '
Сколько там потоков для теста?)))) 100? Да, в условиях большого количества потоков по любому ConcurrentDictionary получше будет за счет снижения блокировок. Но там прикладная логика, которая будет неактуальна, когда потоков всего 2-3. Lock построен на критической секции, и в условиях отсутствия конкуренции за ресурсы практически ничего не стоит.
...
Рейтинг: 0 / 0
Впечатления от собеседования (связано с .Net)
    #39468672
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Dima Tпропущено...

Я намерил в 2+ раза побыстрее 20543813 '
Сколько там потоков для теста?)))) 100? Да, в условиях большого количества потоков по любому ConcurrentDictionary получше будет за счет снижения блокировок. Но там прикладная логика, которая будет неактуальна, когда потоков всего 2-3. Lock построен на критической секции, и в условиях отсутствия конкуренции за ресурсы практически ничего не стоит.
3 потока.
В исходник под спойлером можно было заглянуть
Код: c#
1.
2.
3.
4.
5.
			var tasks = new Task[3];
			for(int i = 0; i < tasks.Length; i++) {
				tasks[i] = Task.Run(() => Task1());
			}
			Task.WaitAll(tasks);
...
Рейтинг: 0 / 0
25 сообщений из 83, страница 3 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Впечатления от собеседования (связано с .Net)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]