c比java_C比Java慢:为什么?

我很快写了一个C程序,提取了一组gzip文件(包含约50万行)的第i行.这是我的C程序:

#include

#include

#include

#include

#include

/* compilation:

gcc -o linesbyindex -Wall -O3 linesbyindex.c -lz

*/

#define MY_BUFFER_SIZE 10000000

static void extract(long int index,const char* filename)

{

char buffer[MY_BUFFER_SIZE];

long int curr=1;

gzFile in=gzopen (filename,"rb");

if(in==NULL)

{

fprintf(stderr,"Cannot open \"%s\" %s.\n",filename,strerror(errno));

exit(EXIT_FAILURE); }

while(gzread(in,buffer,MY_BUFFER_SIZE)!=-1 && curr<=index)

{

char* p=buffer;

while(*p!=0)

{

if(curr==index)

{

fputc(*p,stdout);

}

if(*p=='\n')

{

++curr;

if(curr>index) break;

}

p++;

}

}

gzclose(in);

if(curr

{

fprintf(stderr,"Not enough lines in %s (%ld)\n",curr);

}

}

int main(int argc,char** argv)

{

int optind=2;

char* p2;

long int count=0;

if(argc<3)

{

fprintf(stderr,"Usage: %s (count) files...\n",argv[0]);

return EXIT_FAILURE;

}

count=strtol(argv[1],&p2,10);

if(count<1 || *p2!=0)

{

fprintf(stderr,"bad number %s\n",argv[1]);

return EXIT_SUCCESS;

}

while(optind< argc)

{

extract(count,argv[optind]);

++optind;

}

return EXIT_SUCCESS;

}

作为测试,我在java中编写了以下等效代码:

import java.io.*;

import java.util.zip.GZIPInputStream;

public class GetLineByIndex{

private int index;

public GetLineByIndex(int count){

this.index=count;

}

private String extract(File file) throws IOException

{

long curr=1;

byte buffer[]=new byte[2048];

StringBuilder line=null;

InputStream in=null;

if(file.getName().toLowerCase().endsWith(".gz")){

in= (new GZIPInputStream(new FileInputStream(file)));

}else{

in= (new FileInputStream(file));

}

int nRead=0;

while((nRead=in.read(buffer))!=-1)

{

int i=0;

while(i

{

if(buffer[i]=='\n')

{

++curr;

if(curr>this.index) break;

}

else if(curr==this.index)

{

if(line==null) line=new StringBuilder(500);

line.append((char)buffer[i]);

}

i++;

}

if(curr>this.index) break;

}

in.close();

return (line==null?null:line.toString());

}

public static void main(String args[]) throws Exception{

int optind=1;

if(args.length<2){

System.err.println("Usage: program (count) files...\n");

return;

}

GetLineByIndex app=new GetLineByIndex(Integer.parseInt(args[0]));

while(optind < args.length)

{

String line=app.extract(new File(args[optind]));

if(line==null)

{

System.err.println("Not enough lines in "+args[optind]);

}

else

{

System.out.println(line);

}

++optind;

}

return;

}

}

事情发生在同一台机器上,java程序要比C程序(〜2’15“)要快得多(〜1’45”)(我经历了几次测试).

怎么解释这个差异?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值