Perl学习笔记一: 简单文件I/O

近来工作中遇到一个问题:要求把指定目录下的所有C++源文件连接成一个单独的文件。作者写了一个Perl程序来实现这个功能。因为作者一直想了解Perl语言的确切运行效率,所以花了点时间写了相同功能的C程序,比较了一下两者的运行速度。

 

Perl源程序如下:

 

#!perl -w

# Usage: fjoin.pl <dir>
# This program print all .cpp/.h files in <dir> to stdout

use 5.010;
use strict;
use warnings;

# Sub: print a file to stdout
# Arguments:
#     $_[0]  The file name
sub printFile
{
    my $success = open FHANDLE, "<", $_[0];
    if(! $success)
    {
        return;
    }

    while(<FHANDLE>)
    {
        print $_;
    }

    close FHANDLE;
}

# The main program
my $dir = $ARGV[0];
my @allFiles;
my $file;

if(!defined($dir))
{
    die "Directory not defined";
}

# Iterate all files in the dir
@allFiles = <$dir/*>;

if(! @allFiles)
{
    die "Can not open the directory $dir";
}

foreach $file (@allFiles)
{
    if($file =~ //.cpp$/)
    {
        printFile($file);
    }
    elsif($file =~ //.h$/)
    {
        printFile($file);
    }
}

C源程序较长,我还不知道怎样添加链接,就暂不贴出。

 

两个程序的大体思路一样:对命令行参数指定的目录中的所有.h和.cpp文件,读出它们的内容,输出到标准输出。两个程序主要的不同是Perl程序读入和输出文件时以行为单位,C程序一次能全部读入源文件内容,一次全部输出到标准输出。

 

我的测试方法为:对eMule 0.49c的源程序的eMule0.49c-Source/srchybrid目录执行这两个程序,运行5次,取均值比较。因为打印到标准输出较慢,所以我将它们的标准输出重定向到文件。

 

我使用的硬件平台为:
CPU: Athlon 64 X 2 4800+
RAM: 2GB

 

软件环境为:
Ubuntu 9.04 for AMD64
Linux 2.6.28-15
gcc 4.3.3
Perl 5.10.0
Glibc 2.9-4ubuntu6.1

 

C程序的编译选项为:-O2 -fomit-frame-pointer -Wall

 

运行结果为:
C程序:0.0214秒
Perl程序:0.3726秒

 

在这个特定情况下,C程序的速度是Perl程序的10倍以上。

 

当然,这次比较有不公平的地方:Perl程序的输入输出方法不如C程序高效。后续我还将实现与C程序同样算法的Perl程序,再次比较。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/*******************说明:************************** 单片机进入掉电模式后,外部时钟停振, CPU/定时器/串口全部停止工作,只有外部中断处于工作状态 使单片机进入掉电模式的方法是:将PCON寄存器的PD位置1 -------------------------------------------------- 实验现象:系统复位后,P0口所有LED灯被点亮,无闪烁.说明 单片机进入了掉电模式,按下中断按键INT0后,所有LED灯 闪烁,说明单片机从掉电模式中被唤醒 -------------------------------------------------- 相关资料请参考STC89C51RC.pdf第78页 -------------------------------------------------- 基于开发板ZS001编写 开发板购买地址: http://shop60591679.taobao.com/ QQ:284083167 Email:284083167@qq.com 对此程序有任何疑问可QQ或者邮件联系 **************************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int //功能:延时1毫秒 //入口参数:x //出口参数:无 //说明:当晶振为12M时,j<112;当晶振为11.0592M时,j<122 void Delay_xms(uint x) { uint i; uchar j; for(i=0;i<x;i++) for(j=0;j<112;j++); } //外部中断0函数,中断方式:下降沿中断 void INT0_L(void) interrupt 0 { PCON|=0x02; //进入掉电模式 } void INT1_fall(void) interrupt 3 { //PCON|=0x02; //进入掉电模式 } //主函数 void main(void) { Delay_xms(50);//等待系统稳定 EA=0; //关总中断 IT0=1; //下降沿中断 EX0=1; //开INT0中断 IT1=1; //下降沿中断 EX1=1; //开INT1中断 EA=1; //开总中断 P0=0x00; //点亮所有LED //PCON|=0x02; //进入掉电模式 while(1) { P0=0x00; //点亮P0口所有LED Delay_xms(1000); P0=0xff; //关闭P0口所有LED Delay_xms(1000); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值