Я занимался некоторыми исследованиями, и у меня сложилась такая ситуация. Если вы хотите записать на STDOUT (экран), вы не сможете выполнить многопоточный скрипт, который быстрее печатает данные, чем простой сценарий с одним потоком. Но, если вы пишете в файл, как это:Производительность с использованием STDOUT (экран) против обычного файла
myPrinter.perl > myPrint
Изменение результата, и вы можете увидеть, что многопоточный подход получает лучшее время. Я сомневаюсь, поскольку STDOUT (экран) или выходной файл являются общими ресурсами, не будет ли время доступа аналогичным? Почему многопоточный подход только лучше работает с файлом?
Perl-скриптов, которые я использовал в экспериментах:
Single нить
for my $i (1..100000000){
print("things\n");
}
многопоточного
use threads;
use Thread::Queue 3.01 qw();
use constant NUM_WORKERS => 4;
sub worker {
for my $i (1 .. 25000000){
print("things\n");
}
}
my $q = Thread::Queue->new(); #::any
async { while (defined(my $job = $q->dequeue())) { worker($job); } }
for 1..NUM_WORKERS;
for my $i (1 .. 4){
$q->enqueue($i);
}
$q->end();
$_->join for threads->list;
Кредиты: реализация очереди было принято из один из ответов ikegami.
[Страдает от буферизации?] (Http://perl.plover.com/FAQs/Buffering.html) – ThisSuitIsBlackNot
Что вы подразумеваете под «_to STDOUT_» ... на самом деле выпускаете его на экране? Это займет больше времени, все рендеринг, перерисовка и многое другое. Время однопоточного, для экранирования и перенаправления. Я не знаю, как это влияет на несколько потоков, но я предполагаю, что это может быть только хуже. Кроме того, как говорит ThisSuitIsBlackNot, буферизация может отличаться. – zdim