Tôi nghĩ rằng *
trong cụm từ thông dụng trong câu hỏi và hầu hết các câu trả lời có thể là sự sụt giảm lớn so với việc sử dụng +
. Hãy xem xét thay thế đầu tiên trong câu hỏi
s/[\s\t]*|/|/g
các *
trận zero hoặc nhiều mục tiếp theo là một |
, do đó mỗi |
được thay thế ngay cả những người không cần phải thay thế. Thay đổi thay thế thành
s/[\s\t]+|/|/g
sẽ chỉ thay đổi |
ký tự đứng trước một hoặc nhiều dấu cách và tab.
Tôi không có sed, nhưng tôi đã làm một thử nghiệm với Perl. Trên dữ liệu tôi đã sử dụng tập lệnh với *
mất gần 7 lần so với tập lệnh có +
.
Thời gian nhất quán giữa các lần chạy.Đối với số +
, chênh lệch giữa thời gian tối thiểu và tối đa là 4% mức trung bình và cho số *
là 3,6%. Tỷ lệ thời gian trung bình là 1 :: 6,9 cho +
:: *
.
chi tiết của thí nghiệm
Tested sử dụng một tập tin 80MB với chỉ hơn 180.000 lần xuất hiện của [st]\.
, đó là những ký tự chữ thường s
và t
.
Thử nghiệm đã sử dụng tệp lệnh lô với 30 của mỗi lệnh trong số hai lệnh này, thay thế dấu sao và dấu cộng.
perl -f TestPlus.pl input.ltrar > zz.oo
perl -f TestStar.pl input.ltrar > zz.oo
Một kịch bản ở dưới, người kia chỉ đơn thuần là thay đổi *
-+
và star
-plus
.
#! /bin/usr/perl
use strict;
use warnings;
use Time::HiRes qw(gettimeofday tv_interval);
my $t0 = [gettimeofday()];
while(<>)
{
s/[st]*\././g;
}
my $elapsed = tv_interval ($t0);
print STDERR "Elapsed star $elapsed\n";
phiên bản Perl sử dụng:
c:\test> perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2012, Larry Wall
Binary build 1603 [296746] provided by ActiveState http://www.ActiveState.com
Built Mar 13 2013 13:31:10
How are you gọi sed? Tệp có chắc chắn trên đĩa cục bộ của bạn và không, giả sử, trên một NFS gắn kết? –
Tệp trên đĩa cục bộ. Tôi đang gọi sed với sed -f – erotsppa
Vui lòng cung cấp toàn bộ dòng lệnh bạn đang sử dụng. Đồng bằng 'sed -f' đọc từ stdin và viết để stdout, mà rõ ràng không phải là những gì bạn đang làm. –