|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
Покритикуйте код, реализующий асинхронное блокирование ресурса по значению. Пример использования: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Реализация. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 11:13 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVostt Код: c# 1. 2. 3. 4. 5. 6.
Это к примеру, но могу порекомендовать посмотреть на эту либу https://github.com/StephenCleary/AsyncEx Там много вспомогательных примитивов для работы с асинхронностью, от большого спеца по асинхронности (я по его книге как раз и изучал тему асинхронности - очень понятно все разъясняет). В частности там есть и AsyncLock, с которым можно работать как в асинхронном режиме, так и в асинхронном. https://github.com/StephenCleary/AsyncEx/tree/v4 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 14:57 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVostt, Dispose может затянуться ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 15:26 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
WaspNewCoreЭто к примеру, но могу порекомендовать посмотреть на эту либу https://github.com/StephenCleary/AsyncEx Там много вспомогательных примитивов для работы с асинхронностью, от большого спеца по асинхронности (я по его книге как раз и изучал тему асинхронности - очень понятно все разъясняет). Честно говоря, мне очень сильно не нравится код из этого репозитория, я полностью избегаю его использовать. Хотя всё, что там реализовано работает, и работает правильно, большие вопросы к эффективности реализации. Ну и соответствующая статья есть на хабре, как найду, приложу сюда. WaspNewCoreВ частности там есть и AsyncLock, с которым можно работать как в асинхронном режиме, так и в асинхронном. https://github.com/StephenCleary/AsyncEx/tree/v4 Ну в моём коде тоже нормальный асинк лок на SemaphoreSlim, но я с радостью готов услышать, почему он здесь будет работать не эффективно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 15:42 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
ViPRoshVostt, Dispose может затянуться Да, ведь там и происходит блокирование :) А где ты видишь здесь проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 15:43 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVostt, там идет разблокирование, а временем диспоз ты не управляешь ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 15:47 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
ViPRos, Важны гарантии. Диспоз тут для удобства, чтобы не делать try/catch/finally. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 16:14 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVostt, Надо как можно быстрее освободить ресурс. А так как хошь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 16:40 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
ViPRos, а try/catch там аж два раза для monitor вызывается ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 16:51 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
в общем плохой, медленный, нерабочий код ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 16:54 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
ViPRosViPRos, а try/catch там аж два раза для monitor вызывается lock только при операциях со словарём, т.е. очень быстро. Я не знаю как это сделать ещё быстрее, ConcurrentDictionary тут не нужен, так как мне ещё счётчик надо инкрементить/декрементить атомарно совместно с извлечением записи из словаря. ViPRosв общем плохой, медленный, нерабочий код А как сделать быстрее? Мне нужен именно async lock ресурса. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 18:42 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVostt, я, к сожалению, с async не работаю. Просто всегда блокировка точечная операция и ее так обрамлять плохая идея. А синхронную версию типа твоего я тут где то уже выкладывал и ты его видел. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 19:38 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVosttViPRosViPRos, а try/catch там аж два раза для monitor вызывается lock только при операциях со словарём, т.е. очень быстро. Я не знаю как это сделать ещё быстрее Ты неправильно размышляешь. Ты сделал быстро распараллелив разные ресурсы, а насколько быстро происходит распараллеливание это вторично. Это обслуживающий код, и то что он обслуживает намного тяжелее его. В остальном быстрее monitor, т.е. критической секции внутри, только спинлоки, но они тормозят когда ядер проца не хватает. Еще небольшой плюсик можешь поиметь при разведении данных разных потоков по разным кэш-линиям 20429620 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 20:02 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
ViPRosПросто всегда блокировка точечная операция и ее так обрамлять плохая идея. Ты имеешь в виду using? Почему? ViPRosА синхронную версию типа твоего я тут где то уже выкладывал и ты его видел. Синхронную видел :) Но так как щас всё асинках, код приходится переписывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 20:18 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
Dima TТы неправильно размышляешь. Ты сделал быстро распараллелив разные ресурсы, а насколько быстро происходит распараллеливание это вторично. Это обслуживающий код, и то что он обслуживает намного тяжелее его. В остальном быстрее monitor, т.е. критической секции внутри, только спинлоки, но они тормозят когда ядер проца не хватает. Монитор нельзя использовать в контексте асинхронной операции, так как он лочит поток, а надо лочить ресурс, да и C# не скомпилирует await внутри критической секции, именно по этой причине. Тут как бы не про распараллеливание идёт речь, а про асинхронность. Dima TЕще небольшой плюсик можешь поиметь при разведении данных разных потоков по разным кэш-линиям 20429620 В этом имеет смысл, если в кеш-линию попадает то, что процессор может предсказать. Например, при последовательной обработке массива данных, нехорошо будет если будет переключение не на границе линии. Но тут я не большой эксперт, лоу перфоманс только недавно меня стал интересовать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 20:23 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVosttDima TТы неправильно размышляешь. Ты сделал быстро распараллелив разные ресурсы, а насколько быстро происходит распараллеливание это вторично. Это обслуживающий код, и то что он обслуживает намного тяжелее его. В остальном быстрее monitor, т.е. критической секции внутри, только спинлоки, но они тормозят когда ядер проца не хватает. Монитор нельзя использовать в контексте асинхронной операции, так как он лочит поток, а надо лочить ресурс, да и C# не скомпилирует await внутри критической секции, именно по этой причине. Почему? Ты внутри lock делаешь очень легкие операции, все по фэншую. Возможно я что-то не понял в твоем коде, но в целом криминала не вижу. hVosttТут как бы не про распараллеливание идёт речь, а про асинхронность. Ты разработчик виндовса и .net ? Если нет, то речь про распараллеливание. "асинхронность" это продвинутое распараллеливание от разработчиков ОС. hVosttDima TЕще небольшой плюсик можешь поиметь при разведении данных разных потоков по разным кэш-линиям 20429620 В этом имеет смысл, если в кеш-линию попадает то, что процессор может предсказать. Например, при последовательной обработке массива данных, нехорошо будет если будет переключение не на границе линии. Но тут я не большой эксперт, лоу перфоманс только недавно меня стал интересовать :) Об этом Рихтер упоминал, разведи на 64 байта счетчики разных потоков и считать они будут намного быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 20:35 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
Dima TПочему? Ты внутри lock делаешь очень легкие операции, все по фэншую. Возможно я что-то не понял в твоем коде, но в целом криминала не вижу. Ок, спасибо :) Dima TТы разработчик виндовса и .net ? Если нет, то речь про распараллеливание. "асинхронность" это продвинутое распараллеливание от разработчиков ОС. Ну если считать IO-bound отдельным видом потоков, то да :) Dima TОб этом Рихтер упоминал, разведи на 64 байта счетчики разных потоков и считать они будут намного быстрее. А, теперь понял о чём ты :)) StructLayout+FieldOffset? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 20:40 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVosttА, теперь понял о чём ты :)) StructLayout+FieldOffset? Суть в том что если две переменных хранятся в одной кэшлинии, например Код: c# 1. 2. 3. 4.
и два разных потока делают x++ и y++ соответственно, то это будет раз в 7-8 медленнее чем так Код: c# 1. 2. 3. 4. 5.
Но это не точно, пишу по аналогии с С/С++, не уверен что в C# byte buffer[64] это массив внутри структуры, а не указатель на него. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 20:50 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVosttНу если считать IO-bound отдельным видом потоков, то да :) Дай ссылку почитать про это. Может я чего не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 21:14 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
Dima TНо это не точно, пишу по аналогии с С/С++, не уверен что в C# byte buffer[64] это массив внутри структуры, а не указатель на него. Ну то есть так Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
byte buffer[64], кстати, не сдвинет позицию на 64 байта. Ну лан, это лирика :) Суть ясна. Dima TДай ссылку почитать про это. Может я чего не знаю. Наверное знаешь, на всякий https://docs.microsoft.com/en-US/windows/desktop/FileIO/i-o-completion-ports https://blog.stephencleary.com/2013/11/there-is-no-thread.html ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2018, 21:59 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
hVosttПокритикуйте код, реализующий асинхронное блокирование ресурса по значению. В традиции и образе ресурса: код - гавно, афтор - му**к. Да и кстати: куда уехал цирк? где ПТ? По пунктам: - кацелейшн как то странно выглядик. Если его словили то можно и без лока двигать, да ? - overengenered. Можно и нужно просче. SemaphoreSlim не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2018, 14:28 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
mikron- кацелейшн как то странно выглядик. Если его словили то можно и без лока двигать, да ? Хорошее замечание, не хватает проверки на IsCanceled, хотя внутренняя реализация его должна тоже схавать, но здесь проверки не хватает. Вообще, await lock в using уже не выглядит хорошим решением. mikron- overengenered. Можно и нужно просче. SemaphoreSlim не нужен. Другие варианты async lock? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2018, 14:42 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
Следующая версия :) Изменился способ использования Код: 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. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2018, 15:03 |
|
Асинхронное блокирование ресурса по значению
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-7#out-variables ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2018, 15:37 |
|
|
start [/forum/topic.php?fid=20&fpage=28&tid=1399262]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
102ms |
get tp. blocked users: |
1ms |
others: | 299ms |
total: | 481ms |
0 / 0 |