登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云之南

风声,雨声,读书声,声声入耳;家事,国事,天下事,事事关心

 
 
 

日志

 
 
关于我

专业背景:计算机科学 研究方向与兴趣: JavaEE-Web软件开发, 生物信息学, 数据挖掘与机器学习, 智能信息系统 目前工作: 基因组, 转录组, NGS高通量数据分析, 生物数据挖掘, 植物系统发育和比较进化基因组学

perl几个读取文件命令  

2010-05-21 16:28:14|  分类: perl&bioperl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#!/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;
  评论这张
 
阅读(1326)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018