|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
имеется двумерный массив и десятки\сотни потоков его заполняют так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
это очень медленно. как бы этот массив заполнять сразу строками, не вычисляя номер строки? как list, но чтоб массив и безопасно для всех потоков ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 19:40 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
qlewerok массив заполнять сразу строками ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 19:56 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Зачем синхронизировать Interlocked ? Достаточно так Код: c# 1. 2. 3. 4.
Если надо очень быстро, то каждый поток пишет свой массив и в конце все массивы сливать в один. PS Это работает если код именно такой как ты написал ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 19:57 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Dima T, объединять массивы разве не дольше, чем сразу писать нормально в массив? Dima TДостаточно такда, действительно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:06 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Shocker.Pro qlewerok массив заполнять сразу строками +1 Сначала поток заполняет свой массив и добавляет его ConcurrentQueue<T> ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:08 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
qlewerok объединять массивы разве не дольше, чем сразу писать нормально в массив? Надо проверять. Если ты с разных потоков одновременно пишешь в один массив - скорость записи падает раз в 10+ из-за синхронизации кэшей ядер проца. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:11 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Если не углубляться в технические особенности, то потолок распараллеливания ограничивает Закон Амдала . Там формулы простые, из них понятно что чем меньше синхронизации потоков тем лучше распараллеливается решение задачи. Поэтому обычно быстрее получается когда каждый поток посчитал свое, а в конце все отдали результат потоку, который склеивает все результаты в общую кучу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:31 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Dima T, если я создаю массив подмассивов и из разных потоков записываю в разные подмассивы, то всё нормально там с ядрами проца? на выходе хорошо бы нормальный обычный массив иметь, т.к. его потом ещё сложно обрабатывать надо весь. в крайнем случае list. или в нём такие же проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:32 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
qlewerok Dima T, если я создаю массив подмассивов и из разных потоков записываю в разные подмассивы, то всё нормально там с ядрами проца? Не все нормально, но лучше чем было. Будет примерно так (VB не знаю, пишу схематично) Код: c# 1. 2. 3. 4. 5.
Количество записей в общую память снижается, следовательно снижается количество перебросов между кэшами ядер. Насколько быстрее станет - надо тестить. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:38 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Dima Tmass(locali) = local_massнеотслеживаемая ошибка, когда прописываю эту строчку. объявляю глобально Код: vbnet 1.
локально Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 21:29 |
|
заполнение массива несколькими потоками
|
|||
---|---|---|---|
#18+
Можно попробовать ConcurrentDictionary. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2020, 18:13 |
|
|
start [/forum/topic.php?fid=20&msg=40026592&tid=1398401]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 157ms |
0 / 0 |