私はいくつかの調査を行っており、この状況があります。 STDOUT(画面)に書きたい場合は、単純なシングルスレッドスクリプトより速くデータを出力するマルチスレッドスクリプトを実行することはできません。しかし、次のようなファイルに書き込むと、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のいずれかです。
[バッファリングに苦しんでいますか] – ThisSuitIsBlackNot
「_to the STDOUT_」とはどういう意味ですか?実際に画面に表示されますか?それは、すべてのレンダリング、再描画などに時間がかかります。シングルスレッドの時間を、スクリーンとリダイレクトされた時間に合わせる。私はそれがマルチスレッドにどのような影響を与えるのか分かりませんが、私の推測ではそれはもっと悪くなるだけです。また、ThisSuitIsBlackNotによると、バッファリングは異なる場合があります。 – zdim