Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl+threads, корректность сравнения скорости 
:(
    Опции темы
klem4
Дата 26.1.2010, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Не приходилось до сего дня применять в работе потоки в perl, так что познания мои пока не велики в этом вопросе, есть код, в нем 2 сортировки целых и вещественных списков(по 100 000 элементов), в no_threads сабе они происходят последовательно,  а в threads разбиваются на 2 нити. Скорость первой значительно превышает скорость второй.  Верно ли идет разбиение на потоки ?

Код

sub no_threads
{
    &$sort_int;
    &$sort_real;
}
sub multi_threads
{
    ( new threads(\&$sort_int)  )->join;
    ( new threads(\&$sort_real) )->join;
}


Результат работы:
Код

NO_THREADS|1|stop at Tue Jan 26 23:15:33 2010|full_time= 0.0016
THREADS|2|stop at Tue Jan 26 23:15:33 2010|full_time= 0.2262


Perl мультитредовый, процессоры многоядерные. Linux 32bit. 


PM MAIL   Вверх
mvsgt
Дата 27.1.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



вообще с потоками должно быть быстрее, но результат full_time= 0.0016 и 0.2262 1) какие-то маленькие, 2) различаться должны всё-таки не на два порядка а в два раза. На коротких тестах доля накладных расходов скроет разницу в скорости.

Это сообщение отредактировал(а) mvsgt - 27.1.2010, 00:15
PM MAIL   Вверх
klem4
Дата 27.1.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Да, цифры подозрительно маленькие, подозреваю в чем причина, завтра проверю.
PM MAIL   Вверх
DurRandir
Дата 27.1.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Вызов join блокирует текущий поток, заставляю дождаться окончания потока-потомка. Т.е. во 2м варианте у вас выйдет такое же линейное исполнение+накладные расходы на потоки (да, они настолько велики). Правильно так:

push @thr, thread->new();
$_->join() for @thr;

PS: не используйте потоки в perl smile
PM   Вверх
klem4
Дата 27.1.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



1) По поводу странной скорости. Сабы исправлены из вида

Код

my $sort_int = sub
    {
        sort( @int_array )
    };


в

Код

my $sort_int = sub
    {
        my @sorted = sort( @int_array )
    };


2) По поводу вызова. Все равно удручает результат:

Код

sub multi_threads
{
    my @threads = ( new threads(\&$sort_int), new threads(\&$sort_real) );
    $_->join for ( @threads );
}


Код

NO_THREADS|1|stop at Wed Jan 27 18:21:24 2010|full_time= 0.7261
THREADS|2|stop at Wed Jan 27 18:21:25 2010|full_time= 0.9584


Может в сторону fork покопать.
Спасибо за внимание.
PM MAIL   Вверх
mvsgt
Дата 28.1.2010, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Когда что-то тестируете, публикуйте полный текст тестовой программы, иначе никакого смысла нет в публичном обсуждении результатов  неизвестно какого процесса. Например, кусок
 my @sorted = sort( @int_array )
это что за @int_array ? как и где оно определено? Но это только один из вопросов, надо видеть весь текст тестов, чтобыы понять что происходит. И вообще, сколько у Вас процессоров?
PM MAIL   Вверх
klem4
Дата 28.1.2010, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Полный код выглядит так (в модуле Timers сабы для замера времен с использованием Time::HiRes, если надо, приведу и его):

Код

#!/usr/bin/perl
use strict;
use threads;
use lib qw[ /home/lib ];
use Timers;
use constant ARRAY_LENGTH => 100000;

    my @int_array  = map { int rand 1000 } 1..ARRAY_LENGTH;
    my @real_array = map { rand } 1..ARRAY_LENGTH;

    my $sort_int = sub
    {
        my @sorted = sort( @int_array )
    };

    my $sort_real = sub
    {
        my @sorted = sort ( @real_array )
    };


    _start "NO_THREADS", "1";   &no_threads;    _stop "NO_THREADS", "1";
    _start "THREADS", "2";      &multi_threads; _stop "THREADS", "2";

sub no_threads
{
    &$sort_int;
    &$sort_real;
}

sub multi_threads
{
    my @threads = ( new threads(\&$sort_int), new threads(\&$sort_real) );
    $_->join for ( @threads );
}


4 Intel® Xeon® CPU  5110  @ 1.60GHz
cpu cores       : 2

PM MAIL   Вверх
DurRandir
Дата 28.1.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Вообще, оно ещё быстро отработало. Без особых шуток smile

Как перл создаёт свой "поток"?
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 на обработку должны быть значительно больше. Лучше всего, отказаться от потоков вообще smile

PS: как ни странно, но _сначала_ создать потоки, а потом в них с нуля создавать данные - будет быстрее, попробуйте. 2*2*0,15+0,65=1.25
PM   Вверх
klem4
Дата 28.1.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Благодарю за столь развернутый ответ. Поэксперементирую еще на досуге. Плюсанул бы, да 100 постов надо.
PM MAIL   Вверх
shamber
Дата 28.1.2010, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



klem4, не расстраивайтесь, уже плюсанули 
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.