我有用于除去非ASCII字符和^ M一个perl代码但对于一个文件1.5GB这需要14分钟(在Linux 64位,16GB RAM,LANG = C组)
我只是在C中重写了相同的逻辑,现在在perl中进行系统调用这只需要36s(相同的机器,相同的文件)
为什么这个perl代码很慢(我试图复制项目的一小部分).与下面的C程序相比,它需要30倍的时间
PERL
my $newfile = $ARGV[0] . ".cleaned";
open(IN,$ARGV[0]) || die "Could not open file $ARGV[0] $!";
open(OUT,">$newfile");
while(defined($c = getc(IN))){
next if((($i =ord($c)) > 126) || ($i == 13 ));
print OUT $c;
}
close IN;
rename($newfile,$ARGV[0]);
Run Code Online (Sandbox Code Playgroud)
C
#include <stdio.h>
int main(int argc, char **argv){
char tmpfile[200];
FILE *fin,*fout;
int c;
snprintf(tmpfile,180,"%s.cleaned",argv[1]);
fin = fopen(argv[1], "rb");
fout = fopen(tmpfile, "w");
while ((c = fgetc(fin)) != EOF) {
if (c==13 || c > 126) continue;
fputc(c, fout);
}
fclose(fin);
fclose(fout);
rename(tmpfile,argv[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
读取1M的块并使用tr///转换应该比当时读取一个字节更快,
perl -i -pe 'BEGIN{ $/ = \1024**2 } tr|\r\x7F-\xFF||d' file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |