![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| klem4 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: 2 Всего: 2 |
Не приходилось до сего дня применять в работе потоки в perl, так что познания мои пока не велики в этом вопросе, есть код, в нем 2 сортировки целых и вещественных списков(по 100 000 элементов), в no_threads сабе они происходят последовательно, а в threads разбиваются на 2 нити. Скорость первой значительно превышает скорость второй. Верно ли идет разбиение на потоки ?
Результат работы:
Perl мультитредовый, процессоры многоядерные. Linux 32bit. |
||||
|
|||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
вообще с потоками должно быть быстрее, но результат full_time= 0.0016 и 0.2262 1) какие-то маленькие, 2) различаться должны всё-таки не на два порядка а в два раза. На коротких тестах доля накладных расходов скроет разницу в скорости.
Это сообщение отредактировал(а) mvsgt - 27.1.2010, 00:15 |
|||
|
||||
| klem4 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: 2 Всего: 2 |
Да, цифры подозрительно маленькие, подозреваю в чем причина, завтра проверю.
|
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Вызов join блокирует текущий поток, заставляю дождаться окончания потока-потомка. Т.е. во 2м варианте у вас выйдет такое же линейное исполнение+накладные расходы на потоки (да, они настолько велики). Правильно так:
push @thr, thread->new(); $_->join() for @thr; PS: не используйте потоки в perl |
|||
|
||||
| klem4 |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: 2 Всего: 2 |
1) По поводу странной скорости. Сабы исправлены из вида
в
2) По поводу вызова. Все равно удручает результат:
Может в сторону fork покопать. Спасибо за внимание. |
||||||||
|
|||||||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Когда что-то тестируете, публикуйте полный текст тестовой программы, иначе никакого смысла нет в публичном обсуждении результатов неизвестно какого процесса. Например, кусок
my @sorted = sort( @int_array ) это что за @int_array ? как и где оно определено? Но это только один из вопросов, надо видеть весь текст тестов, чтобыы понять что происходит. И вообще, сколько у Вас процессоров? |
|||
|
||||
| klem4 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: 2 Всего: 2 |
Полный код выглядит так (в модуле Timers сабы для замера времен с использованием Time::HiRes, если надо, приведу и его):
4 Intel® Xeon® CPU 5110 @ 1.60GHz cpu cores : 2 |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Вообще, оно ещё быстро отработало. Без особых шуток
Как перл создаёт свой "поток"? 1. Нам надо создать поток - создаём его. На текущий момент все данные в памяти - общие. 2. Клонируемся, делая все данные приватными Теперь, сколько всё это занимает времени? time perl -e 'ar=map{rand} 0..100000;' 0.15s user 0.01s system 99% cpu 0.157 total Сколько занимает времени сортировка? time perl -e 'ar=map{rand} 0..100000; @b=sort @ar' 0.80s user 0.02s system 99% cpu 0.828 total Чистого времени - 0,65 Сколько занимает времени скопировать данные? Это измерение неточное, я просто померяю сколько занимает пройтись по внутренним структурам данных (что обязательно для копирования, оценка снизу): time perl -e 'use Devel::Size qw/total_size/; @ar=map{rand} 0..100000; total_size(\@ar)' 0.29s user 0.02s system 89% cpu 0.338 total Чистого времени - 0.14 Итого, создать 2 массива+отсортировать = 2*(0,15+0,65) = 1.6 Теперь, с потоками. Создать 2 массива, скопировать оба в 1й поток, скопировать оба во 2й поток, отсортировать (учитываем 1 раз, т.к. выполняется одновременно) = 2*0,15+2*2*0.14+0.65=1.51 Это оценка снизу, копирование учитывается не полностью. Выигрыш - в теории, копеечный, в реальности - отрицательный. Чтобы был выигрыш, время копирования данных должно быть меньше времени обработки. Причём проигрыш во времени копирования накапливается гораздо быстрее, чем выигрыш в обработке. Если вам нужны потоки - не держите в памяти много данных _до_ создания потока. Или же затраты CPU на обработку должны быть значительно больше. Лучше всего, отказаться от потоков вообще PS: как ни странно, но _сначала_ создать потоки, а потом в них с нуля создавать данные - будет быстрее, попробуйте. 2*2*0,15+0,65=1.25 |
|||
|
||||
| klem4 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: 2 Всего: 2 |
Благодарю за столь развернутый ответ. Поэксперементирую еще на досуге. Плюсанул бы, да 100 постов надо.
|
|||
|
||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
klem4, не расстраивайтесь, уже плюсанули
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |