加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl函数 open函数读取文件效率比较

发布时间:2020-12-15 20:54:20 所属栏目:大数据 来源:网络整理
导读:因为文件行数少了测试不出来效果,我特意做了包含整1万行的数据,大小170K 本机雷鸟1.1GHZ,内存256兆,IIS5.0 perliisdll环境 #################### 方案一 while 输出 最常用 open (FILES,"index"); while (){ print; } close(FILES); 程序占用 CPU 时间:

因为文件行数少了测试不出来效果,我特意做了包含整1万行的数据,大小170K 本机雷鸟1.1GHZ,内存256兆,IIS5.0 perliisdll环境 #################### 方案一 while 输出 最常用 open (FILES,"index"); while (){ print; } close(FILES); 程序占用 CPU 时间:0.23 usr + 0.22 sys 合计运行时间 450 毫秒 n ####################### 方案二: 数组读取输出 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 毫秒 节省一点时间:) ################################ LC<Nw 方案三: open (FILES,"index"); @_=<FILES>; #print @_; close(FILES); foreach (@_){ print; } 程序占用 CPU 时间:3.79 usr + 0.15 sys 合计运行时间 3940 毫秒 很奇怪,和上面相同,说明,只要打印数组,就和foreach处理方式相同 ############################## r 方案4 不打印 open (FILES,"index"); @_=<FILES>; #print @_; close(FILES); 程序占用 CPU 时间:3.45 usr + 0.00 sys 合计运行时间 3450 毫秒 还是相同 7 更奇怪,少一次循环,为什么时间还相同 ######################################### 方案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 毫秒 ############################################### 散列 X =$ -------------------------------------------------------------------------------- a*rS; open (FILES,"index"); while (<FILES>){$i++; $hash{$i}=($_) } print %hash; close(FILES); 程序占用 CPU 时间:0.66 usr + 0.41 sys 合计运行时间 1070 毫秒 数组的最快方式是450毫秒,散列全部输出时间大概比数组慢一倍 &#124;" 散列不输出TV7[ 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>) $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 毫秒 ########################## (u 以上测试结果有的差别很大,有的差别不大 即使有些差别虽然是细微的,程序中如果把这些命令都采用最优化方式,相信会有效果的 我最近在把我的论坛调用比较频繁的核心代码进行逐行检查,反复测试优化中 谁把其他的方法都测试以下,拿出来给爱好者继续分享,我也继续测试中,今晚测试系统级IO命令,看有没有差别 仅供参考。 附,my测试方法 #########################st> use CGI::Carp qw(fatalsToBrowser); use Benchmark; $TT0 = new Benchmark; print "Content-type: text/htmlnn"; open (FILES,$reads); print @_; ###########################YK print"<hr>"; $TT1 = new Benchmark; $td = Benchmark::timediff($TT1,$TT0); $td = Benchmark::timestr($td); $td =~ /(d+)s*wallclock secs (s*?(d*?.d*?)s*usrs*+s*(d*?.d*?)s*sys/i; my $alltimas=($2+$3)*1000; print "<center><font color=$cpudispcolor>程序占用 CPU 时间:$2 usr + $3 sys 合计运行时间 $alltimas 毫秒"; exit;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读