> На одном проце по определению однопоточный вариант будет выигрывать.

Смотря какая природа у этого варианта. У меня сейчас два потока
работают
- один грузит данные из базы
- второй эти данные обрабатывает.

У этих потоков одна точка соприкосновения - буфер обмена, в которых
каждый проводит не очень много времени.

пока первый простаивает (ждет отклика от БД или сигнала "есть место в
буфере") - второй по полной работает.

если второй "заснул" (например ждет завершения операций с файлом, куда
выгружаются данные), может кто-то еще работать. я предполагал, что
сможет работать параллельный "комбинатор"

проблема в том, что первый успевает насытить буфер с исходными данными
под завязку, а второй пашет как ненормальный что бы этот буфер
освободить, но очень редко когда его опустошает.

Самое что неприятное, у меня по середине какого-то изменения почти
удалось достигнуть желаемого. Но когда все доделал - однопоточный
вариант начал работать в два раза быстрее, а многопоточный все также
клинит, хотя в целом он тоже стал работать быстрее, но видно что не за
счет устранения конфликтов.

Траблы где то на пути регистрации сгенерированных комбинаций в индексе
(он общий для всех потоков "комбинирования") и хотя я там и
"секционированные" блокировки прикрутил и у каждого потока свой
локальный кэш этого индекса - все равно где-то потоки схлестываются и
системное время процесса подскакивает до 30%.

Профайлера у меня нету, так что пока только и остается что разводить
руками.

В приципе, у меня есть идеи как хотя бы выяснить где именно тормоза -
я еще пока понимаю как работает моя игрушка. Но пока достигнутые
результаты меня устраиват и нужно наконец начать двигаться вперед.

Коваленко Дмитрий.

Ответить