您的位置:首页 > 编程语言 > C语言/C++

C/C++/Perl/汇编/Java效率比较---读后感

2011-04-29 10:51 260 查看
今天在网上看到一篇文章,链接如下:http://blogold.chinaunix.net/u/13279/showart_134510.html

个人觉得写得不错,有血有肉的,没有太多空话,用例子说明了下C/C++/Perl/汇编/Java效率,在这给大家推荐下,

他设计了一个简单的选题:从指定文本文件中搜索指定字符串,计 算个数。并且打印出搜索到的个数作为结果输出。作为程序员的你粗粗过一下脑子,马 上会想到这个算法里面包含了条件判断、循环、数组操作等基本的程序语言因素。这满 足了上面第一个条件。另外的,为了满足第二个条件,我准备了一个多达2G的文本文件, 总共有文本1500万行多。这保怔了足够的运行时间(但应该不会太长),而决不会一眨 眼就执行完了。最后的,我们都知道在文本串里面搜索子串的算法是数据结构课本中的一个典型的例子(考试也经常被考到的),也满足算法简单的要求。同时,为了让每 个程序的环境都一样,我得每测试一次就重新启动一次机器,避免CACHE的影响。

由于我主要是学java的,就附上java代码部分,其余的语言的实现可以去看原文

import java.io.*;
public class langtest
{
public static void main(String[] args)
{
String filename = "d:/access.log_";
try
{
count(filename);
}
catch (IOException e)
{
System.err.println(e.getMessage());
}
}
public static void count(String filename) throws IOException
{
long count=0;
long len;
String strline = "";
char hit[] = {'H','I','T'};//要搜索的字符串
char buff[] = new char[2100];
Reader in = new FileReader(filename);//用FileReader类构造产生一个Reader类对象
LineNumberReader line = null;//生成一个空指针
try
{
line = new LineNumberReader(in);//建立LineNumberReader类对象
while((strline = line.readLine()) != null)
{
//到这里已经读出一行了,用下面的代码分析这行有几个HIT
int i=0,j=0,max=0,flag=0;
buff = strline.toCharArray();//转换成字符数组
max = strline.length();
for(i=0;i
{
for(j=0;j<3;j++)
{
if(hit[j] != buff[i+j])
{
flag=0;//一旦有一个不相同就退出并且标志为0
break;
}
else
{
flag=1;//一个相同为1,如果连续都相同最后结果定是1
}
}
if(flag==1)
{
count++;
i+=j-1;
}
else
{
if(j==0)
{
i+=(j);
}
else
{
i+=(j-1);
}
}
}
}
System.out.println("Count : "+count);
}
catch (IOException e)
{
System.err.println(e.getMessage());
}
finally
{
try
{
if(in != null) in.close();
}
catch (IOException e)
{
}
}
}
}


候捷先生翻译的宏篇巨著《JAVA编程思想》一书中第67页说到:"使用最原始的JAVA 解释器,JAVA大概比C慢上20到50倍"之说法我在阅读的时候就心存疑虑,心想要是这样, JAVA完全没有存或与世间的必要了。在亲自动手试验过后,我觉得说JAVA在J2EE环境下, 比C慢上2-3倍还是比较可靠的说法的。况且,目前越来越多的硬件JVM的诞生,也给JAVA 越来越多的机会。不过我担心的正是这点, JVM的多厂家多样化很可能会造成某些兼容 性方面的问题。例如我见过一篇文章就是讨论某种JAVA程序在IBM-JVM可用而在SUN-JVM 上不可用之事例。但愿的,JAVA能健康成长。

最后原文的总结很好,让我这个菜鸟懂得了一些知识,就是
事实上,本文测试中有一个大大的不公平之处,相信仔细的读者已经发现了:其中 C和ASM都是使用缓冲区直读的办法,不管三七二十一就进行判断(最后用指针检查缓冲

区边界)。而C++等其他的语言虽然用了非常方便的流按行读出,但是多做了很多事情: 每一个字符都要判断其是不是回车换行符,而按行读近来,每次缓冲的也要少很多。因 此其他几种语言就大大的吃亏了。不过这并不影响结论性的东西,因为测试本身就说明 越方便就效率越低。事情总是要有人做,不是吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: