使用 STDOUT(屏幕)与常规文件的性能

Ivá*_*res 6 perl performance multithreading stdout file-handling

我一直在做一些研究,我得到了这种情况。如果您想写入 STDOUT(屏幕),您将无法执行多线程脚本,该脚本比简单的单线程脚本更快地打印数据。但是,如果您写入这样的文件:

myPrinter.perl > myPrint
Run Code Online (Sandbox Code Playgroud)

结果发生了变化,您可以看到多线程方法获得了更好的时间。我的疑问是,由于 STDOUT(屏幕)或输出文件都是共享资源,访问时间不会相似吗?为什么多线程方法只能更好地写入文件?

我在实验中使用的 perl 脚本是:

单线程

for my $i  (1..100000000){
    print("things\n");
}
Run Code Online (Sandbox Code Playgroud)

多线程

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; 
Run Code Online (Sandbox Code Playgroud)

积分:队列实现取自池上的答案之一。

zdi*_*dim 7

一个例子,跟进我的评论。我从这个问题中了解到,您将STDOUT终端上的打印内容与重定向到文件的打印内容进行比较。

\n

定时打印到控制台和文件

\n
time perl -we'print "hello\\n" for 1..1_000_000'\n
Run Code Online (Sandbox Code Playgroud)\n

时间: \xc2\xa0 0.209u 1.562s 0:17.65 9.9% 0+0k 0+0io 0pf+0w\xc2\xa0 (tcsh)

\n
time perl -we'print "hello\\n" for 1..1_000_000' > many_writes.out\n
Run Code Online (Sandbox Code Playgroud)\n

时间:\xc2\xa00.104u 0.005s 0:00.11 90.9% 0+0k 0+11720io 0pf+0w

\n

那是17.65秒与0.11秒。打印到终端的速度非常非常慢。

\n

对于多个线程,我预计差异会更加明显。

\n


ike*_*ami 5

如果写入 STDOUT 需要某种形式的内部锁定,这可以解释。

当 STDOUT 连接到终端时,每次换行后都会刷新输出。否则,STDOUT 仅每 4 KiB 或 8 KiB 刷新一次(取决于您的 Perl 版本)。后一种情况可能需要更少或更短的锁。

您可以使用|cat代替>file来获得相同的效果。

如果您的实际工作人员花费更少的时间写入 STDOUT,则此问题应该会消失。