2010-05-21 16:28:14| 分类: perl&bioperl | 标签: |举报 |字号大中小 订阅
#!/usr/bin/perl -w print"请输入输入文件包括完全路径File>\n";
my $file=<STDIN>;
print"请输入输出文件包括完全路径File>\n";
my $file1=<STDIN>;
if(!open(File,$file)){
die "File not Found"; } if(!open(File1,"> $file1")){ die "File1 not Found"; } while(<File>){ chomp; print "$_\n"; print File1 "$_"; } close(File); close(File1); #################### 方案一 while 输出 最常用 open (FILES, "index"); while (<FILES>){ print; } close(FILES); 程序占用 CPU 时间:0.23 usr + 0.22 sys 合计运行时间 450 毫秒 ####################### 方案二: 数组读取输出 open (FILES, "index"); @reads=<FILES>; print @reads; 程序占用 CPU 时间:4.18 usr + 0.09 sys 合计运行时间 4270 毫秒 这个方法也常用,但效率最低的 换为@_; open (FILES, "index"); @_=<FILES>; print @_; 程序占用 CPU 时间:3.64 usr + 0.11 sys 合计运行时间 3750 毫秒 节省一点时间:) ################################ 方案三: open (FILES, "index"); @_=<FILES>; #print @_; close(FILES); foreach (@_){ print; } 程序占用 CPU 时间:3.79 usr + 0.15 sys 合计运行时间 3940 毫秒 很奇怪,和上面相同,说明,只要打印数组,就和foreach处理方式相同 ############################## 方案4 不打印 open (FILES, "index"); @_=<FILES>; #print @_; close(FILES); 程序占用 CPU 时间:3.45 usr + 0.00 sys 合计运行时间 3450 毫秒 还是相同 更奇怪,少一次循环,为什么时间还相同 ######################################### 方案6,用变量代替数组直接读取输出。 open (FILES, "index"); $/=""; $reads=<FILES>; print $reads; close(FILES); $/="\n"; 程序占用 CPU 时间:0.04 usr + 0.00 sys 合计运行时间 40 毫秒 真快丫 ############################################## 方案7 用分割变量来从新生成数组,代替数组@_=<FILES> 直接读取方式,循环输出 open (FILES, "index"); $/=""; $reads=<FILES> close(FILES); $/="\n"; @_=split ( /\n/,$reads); foreach (@_){ print $_; } 程序占用 CPU 时间:0.34 usr + 0.11 sys 合计运行时间 450 毫秒 有趣,比普通@_=<FILES> 直接读的方法要快10倍,但很是不解 如果数组不全部输出,单纯赋值占用时间很短 open (FILES, "index"); $/=""; $reads=<FILES> close(FILES); $/="\n"; @_=split ( /\n/,$reads); 程序占用 CPU 时间:0.05 usr + 0.00 sys 合计运行时间 50 毫秒 ############################################### 散列 -------------------------------------------------------------------------------- open (FILES, "index"); while (<FILES>){$i++; $hash{$i}=($_) } print %hash; close(FILES); 程序占用 CPU 时间:0.66 usr + 0.41 sys 合计运行时间 1070 毫秒 数组的最快方式是450毫秒,散列全部输出时间大概比数组慢一倍 散列不输出 open (FILES, "index"); while (<FILES>){$i++; $hash{$i}=($_) } #print %hash; close(FILES); 程序占用 CPU 时间:0.09 usr + 0.04 sys 合计运行时间 130 毫秒 还是比数组慢 从hash中取出一个元素 open (FILES, "index"); while (<FILES>){$i++; $hash{$i}=($_) } close(FILES); print $hash{8900}; 程序占用 CPU 时间:0.13 usr + 0.00 sys 合计运行时间 130 毫秒 几乎不增加时间 数组也是,测不出时间 open (FILES, "index"); $/=""; $reads=<FILES>; close(FILES); $/="\n"; @_=split ( /\n/,$reads); print $_[8900]; 程序占用 CPU 时间:0.05 usr + 0.00 sys 合计运行时间 50 毫秒 ########################## 以上测试结果有的差别很大,有的差别不大。 即使有些差别虽然是细微的,程序中如果把这些命令都采用最优化方式,相信会有效果的 我最近在把我的论坛调用比较频繁的核心代码进行逐行检查,反复测试优化中~~~~ 谁把其他的方法都测试以下,拿出来给爱好者继续分享,我也继续测试中,今晚测试系统级IO命令,看有没有差别 仅供参考。 附,my测试方法 ######################### use CGI::Carp qw(fatalsToBrowser); use Benchmark; $TT0 = new Benchmark; print "Content-type: text/html\n\n"; open (FILES, "index"); $/=""; $reads=<FILES>; close(FILES); $/="\n"; @_=split ( /\n/,$reads); print @_; ########################### print"<hr>"; $TT1 = new Benchmark; $td = Benchmark::timediff($TT1, $TT0); $td = Benchmark::timestr($td); $td =~ /(\d+)\s*wallclock secs \(\s*?(\d*?\.\d*?)\s*usr\s*\+\s*(\d*?\.\d*?)\s*sys/i; my $alltimas=($2+$3)*1000; print "<center><font color=$cpudispcolor>程序占用 CPU 时间:$2 usr + $3 sys 合计运行时间 $alltimas 毫秒"; exit; |
评论