|
|
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
Есть громная строка, с которой надо сделать определенные манипуляции. Так как строка огромная, то юзаем многопоточность. я делю строку на равные части и скармливаю потокам на обработку. потом рез-ты обработки вставляю в StringBuffer, в той же последовательности как и отдавал потокам на обработку. Юзаю StringBuffer, так как он потокобезопасный в отличии от StringBuilder. Мой вопрос : По Вашему мнению правильный ли механизм я выбрал для сбора результирующих данных? То есть правильно ли в контексте данной задачи использовать StringBuffer? Или есть более правильное или произвродительное решение для сборки данных, которые потоки обрабатывали паралельно? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 13:30:15 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
Сколько у вас там потоков и как часто вы это планируете запускать, что вдруг сборка результатов стала узким местом? Если со StringBuffer работает без ошибок, то решение - подходящее. Можно ли быстрее? Скорее всего можно. Вопрос в том нужно ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 13:36:12 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
roibush, все зависит рт манипуляций которые нужно сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 13:43:25 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
roibushИли есть более правильное или произвродительное решение для сборки данных не бить данные на куски, чтобы потом их собирать. Если в памяти, то будет быстрее. ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 13:51:16 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за комментарии! Скажите плиз, а если скажем потоки возвращали бы списки обработанных объектов, ну скажем какие-нибудь абстрактные списки заказов List<Order>. то технология сбора обработанных данных та же - самая? То есть ожидание пока все потоки вернут списки объектов? Или есть какая-нибудь продвинутая техника (специальный класс или еще что то), которая собирает у потоков рез-ты их работы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 14:44:45 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 14:48:09 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
roibush, - процессор - 1, потоков - 100. Результат будет медленнее, т.к. процессор всего - 1 (переключение контекста с потока на поток). Остальное можно не мучить голову, т.е. искать нужно где потерял, а не где светло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 14:52:07 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
автор http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html ForkJoin конечно неплохая штука, но конкретно для этой задачи лучше использовать ExecutorService.newFixedThreadPool() вместе с Callable и Future, с ForkJoin стоит возиться если используется рекурсивный механизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 14:56:51 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
Ну и да Petro правильно подметил - если процессор один то нет смысла возиться с многопоточностью, так как таски судя по всему computing-intensive, а вот если ядер хотя бы два - то таки лучше работать параллельно и задать количество потоков в newFixedThreadPool() равное количеству логических процессоров, из Java кода можно получить как Runtime.getRuntime().availableProcessors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 14:59:20 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
Petro123roibush, - процессор - 1, потоков - 100. Результат будет медленнее, т.к. процессор всего - 1 (переключение контекста с потока на поток). Остальное можно не мучить голову, т.е. искать нужно где потерял, а не где светло. Процессор 1 - ядер много. Если обработка включает IO операции, то процессор можно загрузить дополнительными операциями, на время простоя других потоков на IO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 14:59:22 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
забыл никНу и да Petro правильно подметил - если процессор один то нет смысла возиться с многопоточностью, так как таски судя по всему computing-intensive, а вот если ядер хотя бы два - то таки лучше работать параллельно и задать количество потоков в newFixedThreadPool() равное количеству логических процессоров, из Java кода можно получить как Runtime.getRuntime().availableProcessors Если обработка данных исключает IO. Тогда так. Если присутствует работа с базой, сохранение на жесткий диск и т.п. то потоков можно больше запускать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 15:00:45 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
авторЕсли обработка данных исключает IO. Тогда так. Если присутствует работа с базой, сохранение на жесткий диск и т.п. то потоков можно больше запускать. Да, я это и предполагал, вроде слышал что таски завязанные на IO называются IO-intensive, а завязанные на вычисления - compute-intensive, как-то не подумал что это может вызвать недопонимание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 15:17:06 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
забыл никДа, я это и предполагал, вроде слышал что таски завязанные на IO называются IO-intensive, а завязанные на вычисления - compute-intensive, как-то не подумал что это может вызвать недопонимание compute-intensive не обозначает абсолютного отсутствия IO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 15:39:04 |
|
||
|
Покритикуйте плиз решение - многопоточность
|
|||
|---|---|---|---|
|
#18+
авторЕсть огромная строка, с которой надо сделать определенные манипуляции . а можно уточнить следующие моменты 1) насколько огромна строка 2) откуда она берется 3) куда потом кладется 4) что с ней программа делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 16:16:01 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=305&tid=2132403]: |
0ms |
get settings: |
13ms |
get forum list: |
25ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
40ms |
get topic data: |
20ms |
get forum data: |
6ms |
get page messages: |
91ms |
get tp. blocked users: |
3ms |
| others: | 324ms |
| total: | 534ms |

| 0 / 0 |
