![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Pawl |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Уважаемые форумчане,
Исследую возможности Fork-Join фрэймворка. Написал программку возведения в степень числа.
и вот какой вопрос у меня возник: этой строкой
Более того, если написать, к примеру,
все равно количество работающих потоков получается меньшим, чем размер пула. Был бы благодарен, если кто-нибудь объяснит мне, в чем тут дело, и насколько корректно я тут вообще реализовал Fork/Join framework. Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
||||||||
|
|||||||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Имхо проблема в декомпозиции. Надо бы делить работу пополам и правильно мержить:
Писал в браузере, так что мог не учесть какой-нибудь +- 1 или граничный случай. Но в целом идея должна быть понятна -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Идея понятна, подобный способ я, собственно, в начале и применял, но меня смущает то, что в этом случае появляются "лишние" шаги рекурсии. Например, при у = 10 получается такой вывод:
т. е. всего 19 шагов, в то время, как минимально необходимое - 11 (от 10 до 0 вкл.). -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Тут будет 10 считающих шагов, а остальные делают декомпозицию и вычислений не производят. Вот этот код
показывает, какие шаги что делают. Вообще говоря это логично, Fork/Join - это всегда дерево задач, а не линейная последовательность, как в вашем первом посте. -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| Pawl |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Ок, будем разбираться. Кстати, ИМХО, писать
и еще я в самом начале compute() дописал
-------------------- В действительности всё совсем не так, как на самом деле |
||||||
|
|||||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Как уже писал выше - это черновик для иллюстрации концептуальных вещей. Так-то Вы конечно правы -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо!
Вообще, наверное, данный фреймворк не очень подходит для вычисления степени. Ветвления тут явно лишние. Может быть Вы знаете более подходящие и наглядные примеры? Это сообщение отредактировал(а) Pawl - 2.7.2012, 15:10 -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Я когда-то писал merge sort сначала на потоках с ручной синхронизацией, затем - на fork/join, для иллюстрации.
Эта задача разветвляется гораздо лучше. Хорошо должна также пойти обработка любых древовидных структур, например файловых систем. Важно только понимать, что реальный прирост производительности начинается при достаточной вычислительной емкости подзадач. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Может mergesort? Добавлено через 3 минуты и 22 секунды Упс, пардон, меня уже опередили с советом про mergesort |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Ок, я тоже попробую - для иллюстрации. Это сообщение отредактировал(а) Pawl - 2.7.2012, 15:47 -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |