Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
06.06.2017, 12:59
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
На днях ходил на встречу, где был заданы всего два вопроса: автор1) Что Вам не нравится в приведенном коде: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
автор2) Как организовать доступ к объекту (dict, из примера выше, надо поправить тело метода GetValue) несколькими потоками? Ответ на первый вопрос заключался в том, что вместо Код: c# 1. 2.
нужно использовать Код: c# 1. 2. 3.
Если честно, я всегда использовал 1й вариант и по 2му у меня какие-то сомнения возникли, я не понял выгоды, чем 1й вариант, хуже 2го. Написал небольшую утилиту чтобы проверить время выполнения первого и второго куска. В словарь было добавлено 40 млн записей, разницы в производительности никакой, вообще. Возможно на слабом железе что-то и проявится, но в моем случае поиск в обоих случаях выполняется за одинаковое кол-во временных единиц. Кто-то может объяснить преимущество одного варианта над другим? По второму вопросу ответ дам чуть позже, хочется услышать ваши решения. Я так же озвучу, какой вариант я предложил. Он был неправильным, мне сказали, что существует только одно решение задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:12
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
ИМХО первый вариант от второго ничем не отличается. Два поиска key в dict Может правильно все-таки Код: c# 1. 2. 3.
так один поиск будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:13
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TИМХО первый вариант от второго ничем не отличается. Два поиска key в dict Может правильно все-таки Код: c# 1. 2. 3.
так один поиск будет. да, value. Это очепятка, код тут набивал ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:14
|
|||
---|---|---|---|
|
|||
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_Пав, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
как видишь, разница по сути 0вая, просто с TryGetValue код "удобочитамее". Но как по мне, пофигу вообще, не принципиально. хотя с учётом современных версий C# код должен выглядеть след. образом: Код: c# 1. 2.
+ если данный в многопоточной среде лучше не применять ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:17
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Вот результат поиска GetValueI start at:06-06-2017 10:14:26.330 Guid = 0df051e7-c221-468b-aca6-85f514a723dd GetValueI end at:06-06-2017 10:14:26.332 GetValueII start at:06-06-2017 10:14:26.333 Guid = 0df051e7-c221-468b-aca6-85f514a723dd GetValueII end at:06-06-2017 10:14:26.333 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:14:35.483 Guid = 9b88cf75-64fa-4297-98e8-00a85cf67863 GetValueI end at:06-06-2017 10:14:35.484 GetValueII start at:06-06-2017 10:14:35.484 Guid = 9b88cf75-64fa-4297-98e8-00a85cf67863 GetValueII end at:06-06-2017 10:14:35.484 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:14:36.459 Guid = 4b0b3251-32ad-4f94-857a-9185635aedbe GetValueI end at:06-06-2017 10:14:36.460 GetValueII start at:06-06-2017 10:14:36.460 Guid = 4b0b3251-32ad-4f94-857a-9185635aedbe GetValueII end at:06-06-2017 10:14:36.460 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:14:37.499 Guid = 40f25a6f-5e68-496d-9e68-b7aca8e02a71 GetValueI end at:06-06-2017 10:14:37.500 GetValueII start at:06-06-2017 10:14:37.500 Guid = 40f25a6f-5e68-496d-9e68-b7aca8e02a71 GetValueII end at:06-06-2017 10:14:37.501 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:14:38.620 Guid = 929bd12d-bd1f-4d8e-8d0a-1e87e981c14b GetValueI end at:06-06-2017 10:14:38.621 GetValueII start at:06-06-2017 10:14:38.622 Guid = 929bd12d-bd1f-4d8e-8d0a-1e87e981c14b GetValueII end at:06-06-2017 10:14:38.623 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:14:39.445 Guid = 53144be1-66f3-4266-bcda-9fb7acb00086 GetValueI end at:06-06-2017 10:14:39.446 GetValueII start at:06-06-2017 10:14:39.448 Guid = 53144be1-66f3-4266-bcda-9fb7acb00086 GetValueII end at:06-06-2017 10:14:39.448 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:14:40.630 Guid = 061bcf94-3bdb-4fc8-b100-2220f0c8547f GetValueI end at:06-06-2017 10:14:40.631 GetValueII start at:06-06-2017 10:14:40.632 Guid = 061bcf94-3bdb-4fc8-b100-2220f0c8547f GetValueII end at:06-06-2017 10:14:40.632 Continue test? (Y/N) :>Y GetValueI start at:06-06-2017 10:15:16.180 Guid = 07587b42-2937-4d01-afbb-27efa1f61059 GetValueI end at:06-06-2017 10:15:16.180 GetValueII start at:06-06-2017 10:15:16.181 Guid = 07587b42-2937-4d01-afbb-27efa1f61059 GetValueII end at:06-06-2017 10:15:16.182 Continue test? (Y/N) :>N Press Enter GetValueI - это первый вариант поиска, GetValueII - это второй. Как видно, разницы нет ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:19
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_Пававтор2) Как организовать доступ к объекту (dict, из примера выше, надо поправить тело метода GetValue) несколькими потоками? Блокировкой Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:21
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Roman Mejtesудобочитамее по мне, так дело вкуса. Мне больше первый вариант нравится: проверил, выполнил. Во втором случает лишняя переменная появляется. Имхо, дело вкуса. Я просто под небольшим впечатлением от того, что мне говорили, мол второй вариант лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:22
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TСупер_Павпропущено... Блокировкой Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Это был мой вариант. Блокировка им не понравилась. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:26
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
В первом варианте метод GetValue меняет состояние коллекции, что печально. Либо переназвать, либо не добавлять элемент в коллекцию ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:26
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_ПавGetValueI - это первый вариант поиска, GetValueII - это второй. Как видно, разницы нет Кривой замер. Чтобы разницу заметить общее время теста должно быть хотя бы сотни миллисекунд, лучше несколько секунд. Также вопрос какие значения искались, если GetValue() вызывалось каждый с новым значением, т.е. происходило добавление, то разницы не будет. Как уже написал - разница в количестве поисков по dict Код: c# 1. 2.
Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:31
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TСупер_ПавGetValueI - это первый вариант поиска, GetValueII - это второй. Как видно, разницы нет Кривой замер. Чтобы разницу заметить общее время теста должно быть хотя бы сотни миллисекунд, лучше несколько секунд. Также вопрос какие значения искались, если GetValue() вызывалось каждый с новым значением, т.е. происходило добавление, то разницы не будет. Как уже написал - разница в количестве поисков по dict Код: c# 1. 2.
Код: c# 1. 2.
Разница понятна, но по мне, так оба варианта приемлемы. Не могу понять, зачем об этом спрашивать, коль 2 вариант правильные. GetValueI и GetValueII вызывались с одним ключом по разу, ключе менялся, снова был вызов. Я не вижу смысла менять замер, коль разницы нет, оба куска кода отрабатывают очень быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:32
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
По поводу второго вопроса. lock забраковали, мол блокирует потоки. Единственное решение задачи - это класс ReaderWriterLockSlim ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:45
|
|||
---|---|---|---|
|
|||
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima T, авторКак уже написал - разница в количестве поисков по dict дануна.... по кишкам имхо однохуйственно ( гляньте ктнонитьрефлекторм) первый имхо даже живее будет ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:51
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Где-то в степиDima T, авторКак уже написал - разница в количестве поисков по dict дануна.... Кишки уже привели выше 20543115 в дополнение Код: c# 1. 2. 3. 4. 5.
два вызова FindEntry() для исходного кода и один для TryGetValue() ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 13:55
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TГде-то в степиDima T, пропущено... дануна.... Кишки уже привели выше 20543115 в дополнение Код: c# 1. 2. 3. 4. 5.
два вызова FindEntry() для исходного кода и один для TryGetValue() Не могу понять Вас, вы просто объясняете различия или утверждаете, что второй способ лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 14:03
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_ПавDima Tпропущено... Кишки уже привели выше 20543115 в дополнение Код: c# 1. 2. 3. 4. 5.
два вызова FindEntry() для исходного кода и один для TryGetValue() Не могу понять Вас, вы просто объясняете различия или утверждаете, что второй способ лучше? Второй - быстрее, т.к. поиск (вызов FindEntry()) достаточно тяжелая операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 14:05
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TСупер_Павпропущено... Не могу понять Вас, вы просто объясняете различия или утверждаете, что второй способ лучше? Второй - быстрее, т.к. поиск (вызов FindEntry()) достаточно тяжелая операция. А я утверждаю, что нет разницы. Проверил на 40 млн записях. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 14:06
|
|||
---|---|---|---|
|
|||
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima T, тогда да, но надо смотреть чистый код, имхо в первом случае оптимизатор может порвать этот примитив на раз с двумя вызовами - хотя к делу мало относится. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 14:31
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Roman Mejtesпросто с TryGetValue код "удобочитамее" код с параметрами out - сомнительная удобночитаемость ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 14:38
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_ПавDima Tпропущено... Второй - быстрее, т.к. поиск (вызов FindEntry()) достаточно тяжелая операция. А я утверждаю, что нет разницы. Проверил на 40 млн записях. Хреново ты проверял Исходник Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
Результат Код: plaintext 1. 2. 3. 4.
Второй вариант на 30% быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 14:41
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Если несколько потоков, то надо использовать ConcurrentDictionary https://msdn.microsoft.com/ru-ru/library/dd287191(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 15:47
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TСупер_Павпропущено... А я утверждаю, что нет разницы. Проверил на 40 млн записях. Хреново ты проверял Исходник Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
Результат Код: plaintext 1. 2. 3. 4.
Второй вариант на 30% быстрее. Хорош. Вы суммарное время работы со 100к элементов указали, разница в 1.5 секунды не впечатляет. А если сперва заполнить словари (о чем говорилось на собеседовании, было условие, что 99% записей существуют в словаре), то поиск не отличается. Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 15:48
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_ПавПо поводу второго вопроса. lock забраковали, мол блокирует потоки. Единственное решение задачи - это класс ReaderWriterLockSlim Блокирует не надолго, поэтому засомневался что тут поможет ReaderWriterLockSlim, RW блокировки на самом деле достаточно тормозные. Делал по примеру из хэлпа . Исходник Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137.
Результат Код: plaintext 1. 2. 3. 4. 5. 6.
lock() на 20% быстрее оказался. И как правильно замечено выше: надо использовать ConcurrentDictionary(), но в той постановке вопроса это не разрешается. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 15:48
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Супер_ПавОтвет на первый вопрос заключался в том, что вместо Код: c# 1. 2.
нужно использовать Код: c# 1. 2. 3.
Молотком по пальцам таким собеседователям. Логика разная у кода, второй всегда что то вернет, как минимум default(Guid). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.06.2017, 15:54
|
|||
---|---|---|---|
Впечатления от собеседования (связано с .Net) |
|||
#18+
Dima TСупер_ПавПо поводу второго вопроса. lock забраковали, мол блокирует потоки. Единственное решение задачи - это класс ReaderWriterLockSlim Блокирует не надолго, поэтому засомневался что тут поможет ReaderWriterLockSlim, RW блокировки на самом деле достаточно тормозные. Делал по примеру из хэлпа . Исходник Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137.
Результат Код: plaintext 1. 2. 3. 4. 5. 6.
lock() на 20% быстрее оказался. И как правильно замечено выше: надо использовать ConcurrentDictionary(), но в той постановке вопроса это не разрешается. Ничего с потолка не взял. О чем сказали на собеседовании, то и привел. Я обычно забываю такие встречи, но тут прям сомнения закрались, что мне воду в уши льют. Удивило еще, что обошлись одним вопросом. Вакансию нашел в разделе Вакансии сего сайта ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1399861]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 283ms |
total: | 437ms |
0 / 0 |