【问题标题】:Performance using STDOUT (screen) vs regular file使用 STDOUT(屏幕)与常规文件的性能
【发布时间】:2017-07-13 08:22:16
【问题描述】:

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

myPrinter.perl > myPrint

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

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

单线程

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 答案之一。

【问题讨论】:

  • 你所说的“to the STDOUT”是什么意思......实际上让它在屏幕上显示出来?这将需要更长的时间,所有的渲染、重绘等等。计时单线程,以筛选与重定向。我不知道它如何影响多线程,但我的猜测是它只会更糟。此外,正如 ThisSuitIsBlackNot 所说,缓冲可能会有所不同。

标签: multithreading performance perl stdout file-handling


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    定时打印到控制台和文件

    time perl -we'print "hello\n" for 1..1_000_000'
    

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

    time perl -we'print "hello\n" for 1..1_000_000' > many_writes.out
    

    时间:0.104u 0.005s 0:00.11 90.9% 0+0k 0+11720io 0pf+0w

    这是17.65 秒与0.11 秒。打印到终端非常非常慢。

    如果使用多个线程,我预计差异会更加明显。

    【讨论】:

    • 是的,我也做了这个测试。我认为你的评论说得很好。多读了一下,觉得瓶颈在渲染过程。
    【解决方案3】:

    输出数据的速度受目标性能的限制。如果写入本地文件,性能会受到底层操作系统、文件系统和磁盘速度的限制。如果您在网络文件系统上写入文件,则会进一步受到网络速度和文件服务器性能等的限制。一些操作系统级别的缓冲有助于加快速度。

    如果您写入 STDOUT,则取决于 STDOUT 的目标是什么。 STDOUT 可以重定向到文件,通过管道传输到另一个进程,也可以打印到终端。在所有这些情况下,写入速度再次取决于目标介质。与本地文件相比,终端的写入速度通常非常慢。但同样,这不是 STDOUT 与文件的问题,而是 STDOUT 的最终结果。

    【讨论】:

    • 是的,你是对的。我应该澄清一下,当我写 STDOUT 时,我是在屏幕上思考的。我知道每种资源都有不同的限制,但是,我想知道从写入屏幕到写入文件有什么不同。我认为 zdim 在评论中得到了它。
    • @IvánRodríguezTorres:这意味着您的问题与 Perl 和 STDOUT 完全无关,但您只是询问终端的输出速度取决于文件的输出。
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 2017-05-24
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多