|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Dima TДелаешь копию и потом ее добавляешь в кэш. Соответственно при чтении из кэша копию с кэша. Т.к. сама копия в кэше не меняется, то для доступа к ней блокировок не надо. Для экономии памяти можно пожать при записи в кэш. Понял. Только для моего случая это вряд ли оправданно. В том смысле, что общее время работы вырастет. А проблему нехватки памяти процессу я "надолго"(думаю, до 2^31) решил использованием BoolArray32. Не совсем понял "трюка" с _lock (формальным объектом?) в последней версии решета Эратосфена. Для lock всё равно что ли, что будет у него в ()? Можно пояснить? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 11:46 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
AR®Не совсем понял "трюка" с _lock (формальным объектом?) в последней версии решета Эратосфена. Для lock всё равно что ли, что будет у него в ()? Можно пояснить? Скопипастил откуда-то, можно было написать lock(values). В остальном без разницы какой объект блокировать, главное чтобы все места кода блокировали один и тот же объект. Т.е. блокировка это по сути флаг, установить который может только один поток, второй (при попытке установить) будет ждать пока первый закончит. Если кратко, алгоритм использования блокировок такой: установить флаг, поработать со всеми объектами которые он защищает, снять флаг. Т.е. не надо 10 блокировок для 10 взаимосвязанных объектов, достаточно одной. Почитай Рихтера, глава "Класс Monitor и блоки синхронизации" там подробно расписано как это устроено. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 12:29 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Dima TПочитай Рихтера, глава "Класс Monitor и блоки синхронизации" там подробно расписано как это устроено. Лучше про ReaderWriterLockSlim ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 12:42 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Решил пока сосредоточиться на оптимизациях самого алгоритма и задумался: конструкция вида Код: c# 1.
гарантирует инициализацию всего массива нулями? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 15:09 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
AR®Решил пока сосредоточиться на оптимизациях самого алгоритма и задумался: конструкция вида Код: c# 1.
гарантирует инициализацию всего массива нулями? Да. Не совсем то, но похожий случай https://msdn.microsoft.com/ru-ru/library/0a7fscd0.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 15:20 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
интересно, насколько быстрее будет аккуратно написанное на С ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 15:23 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Интересно, что тогда более правильно делать много (миллионы) раз за время выполнения программы Код: c# 1. 2. 3.
или Код: c# 1. 2. 3.
Изопропилинтересно, насколько быстрее будет аккуратно написанное на С Тут весь вопрос, на каком C, и чем он будет скомпилирован. Вы, возможно, имели ввиду, что результат будет не под .Net ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 15:45 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
AR®Вы, возможно, имели ввиду, что результат будет не под .Net ? естесnвенно без dotnet а с компиляторами вариантов немного - MSVC и gcc ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:33 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Изопропилинтересно, насколько быстрее будет аккуратно написанное на С Если совсем без проверок на корректность параметров, то результаты такие (MSVC2015 x86) Размерc# мсc++ мсОтношение10000006350%200000013862%4000000271763%8000000563664%10000000724563%2000000015510568%4000000036125170%8000000099269770%100000000138597971%2000000003246252878%4000000007075555378%800000000147221205782% Исходник Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:37 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
AR®Интересно, что тогда более правильно делать много (миллионы) раз за время выполнения программы Код: c# 1. 2. 3.
или Код: c# 1. 2. 3.
ИМХУ второе. Но затести, может для твоего случая первое окажется быстрее. Тут еще учитывай тот момент что запуск сборки мусора останавливает все потоки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:48 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
и это Код: c# 1. 2.
в книжках рекомендуют писать так Код: c# 1. 2.
утверждают так работает быстрее. Объясняют тем что компилятор убирает проверку индекса на выход за границы массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:51 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Dima T [src c#] for (int i = 0; i < valuesSize; i++) values[i] = 0; Обычно делают что то типа [src c#] for (int i = 0; i < valuesSize; i++++) values[i] = 0; values[i+1] = 0; [/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 17:01 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
ЕвгенийВ, вот что Рихтер пишет по этому поводу Внутренняя реализация массивов...Кроме того, в общем случае компилятор умеет выносить код проверки границ за пределы цикла. К примеру, рассмотрим следующий код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Обратите внимание на вызов свойства Length в проверочном выражении цикла for. Фактически при этом вызывается метод, но JIT-компилятор «знает», что Length является свойством класса Array, поэтому создает код, в котором метод вызывается всего один раз, а полученный результат сохраняется в промежуточной переменной. Именно ее значение проверяется на каждой итерации цикла. В результате такой код работает очень быстро. Некоторые разработчики недооценивают возможности JIT-компилятора и пишут «умный код», пытаясь помочь его работе. Однако такие попытки практически всегда приводят к снижению производительности, а также делают готовую программу непонятной и неудобной для редактирования. Поэтому пусть свойство Length вызывается автоматически. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 17:13 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Dima T, замена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 22:45 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
ИзопропилDima T, замена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++) x86 или x64 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2016, 07:10 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Dima TИзопропилDima T, замена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++) x86 или x64 ? ошибка закралась... ничего не помогает. inline, замена маски на сдвиг, Set(,true) без ветвления. машинный код чистый, всё что можно на регистрах. потеря в 20% - наверное неплохой результат для dotnet ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2016, 10:26 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Изопропилпотеря в 20% - наверное неплохой результат для dotnet На самом деле еще меньше. Пробовал в код С++ добавить контроль выхода индекса за пределы - время лучше на 10-15% по сравнению с C#. Так что результат очень даже неплохой. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2016, 18:34 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Dima Tв книжках рекомендуют писать так Код: c# 1. 2.
утверждают так работает быстрее. Объясняют тем что компилятор убирает проверку индекса на выход за границы массива. Категорически опровергаю . Потеря общего времени работы 3-5%, причём устойчиво повторяющаяся. Изопропилзамена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++) На C# только проигрыш, что на 32-, что на 64-битной ОС. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 11:50 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
ЕвгенийВОбычно делают что то типа Код: c# 1. 2. 3. 4. 5.
Результат, увы, не лучше. Даже если написать values[i] = values[i+1] = 0; ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 12:56 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
AR®, Array.Clear(arr, 0, arr.Length) также? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 13:03 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
buser Array.Clear(arr, 0, arr.Length) Вроде как чуть быстрее, чем свой явный for() всех испытанных разновидностей. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 15:48 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Ещё вести с полей, из разряда о чём не знал Марти Стауффер :) В какой-то момент сообразил, что в моём алгоритме нигде не требуется сбрасывать отдельный элемент в BoolArray32 в false, а только устанавливать в true. И написал вместо Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
сначала Код: c# 1. 2. 3. 4. 5. 6.
а потом Код: c# 1. 2. 3. 4.
(и звал settrue() вместо set() ) Первая "оптимизация" приводит к потере времени ~на 15%, вторая ещё на 2-4% ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2016, 14:33 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
AR®Первая "оптимизация" приводит к потере времени ~на 15%, вторая ещё на 2-4% странно это всё.... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2016, 12:35 |
|
Максимальный размер ConcurrentDictionary в 32-битных приложениях
|
|||
---|---|---|---|
#18+
Изопропил, ггыгы))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2016, 12:54 |
|
|
start [/forum/topic.php?fid=20&msg=39253747&tid=1399876]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 173ms |
0 / 0 |