Perl
Perl:s的速度///
這個:
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); }