Perl

Perl:s的速度///

  • July 31, 2022

這個:

while($read=sysread(STDIN,$buf,32760)) {
   $buf=~s/\r/posttag\rpretag\t/go;
   $buf=~s/\n/posttag\npretag\t/go;
   syswrite(STDOUT,$buf);
}

在我的系統上提供 ~200 MB/s。

這個:

my $pretag = "pretag";
my $posttag = "posttag";
while($read=sysread(STDIN,$buf,32760)) {
   $buf=~s/\r/$posttag\r$pretag\t/go;
   $buf=~s/\n/$posttag\n$pretag\t/go;
   syswrite(STDOUT,$buf);
}

在我的系統上提供 ~100 MB/s。

為什麼?

我認為當我使用 /o 時,內容是變數還是固定字元串都無關緊要。有沒有一種簡單的方法可以讓我獲得第一個的速度?

你確定正則表達式重新編譯是罪魁禍首嗎?您可以使用以下方式獲取有關 perl 對您的正則表達式所做的操作的資訊

use re 'debug';

在第二種情況下,您在 s//HERE/ 中引入插值字元串,並且 perl 在每次迭代時對其進行插值。

嘗試像這樣重寫

my $pretag = 'pretag';
my $posttag = 'posttag';
my $first_replace = "$posttag\r$pretag\t";
my $second_replace = "$posttag\n$pretag\t";
while($read=sysread(STDIN,$buf,32760)) {
   $buf=~s/\r/$first_replace/go;
   $buf=~s/\n/$second_replace/go;
   syswrite(STDOUT,$buf);
}

引用自:https://unix.stackexchange.com/questions/711892