Java "有理由" 比 C++ 快

类别:编程语言 点击:0 评论:0 推荐:

最近上CSDN比较多,又看到说Java比C++更快的帖子。
Java在某些情况下比C++快我认为是很有道理的。例如可以根据特定的CPU进行优化等等。

有位叫 wingfiring(别逗了)(非典型秃子) 的老兄发了一个帖子,原文如下:

好,我没那么多时间吵C++好还是Java好,所以,我就先瞻仰一下楼主给出的链接吧,
第一个:
http://kano.net/javabench/
里面有两段代码
http://kano.net/javabench/src/cpp/
http://kano.net/javabench/src/java/

然后给出了自己的理由驳斥这个观点。可惜马上就淹没在无休止的垃圾贴子后面。

我然后就拿上面的这个链接来说,分析为什么Java比C++快。

大概的源代码贴出来:
Java版本:

try {
 byte[] buff = new byte[4096];
 boolean inword = false;
 int length;
 while ((length = System.in.read(buff)) != -1)  #1
 {
  nc += length;
  for(int i = 0; i < length; i++) {   #2
   char c = (char)buff[i];
   if (c == '\n')
    ++nl;
   if (Character.isWhitespace(c))
    inword = false;
   else if (inword == false) {
    ++nw;
    inword = true;
   }
  }
 }
注意#1这一行,read将4K字节读入buff中,然后在#2进行内层循环,

C++版本;

    char buff[4096];
    cin.rdbuf()->pubsetbuf(buff, 4096);  #0// enable buffering

    state = OUT;
    nl = nw = nc = 0;
    int intc;
    streambuf* sbuf = cin.rdbuf();
    while ((intc = sbuf->sbumpc()) != EOF) {  #1
        c = (char)intc;
        ++nc;
      if (c == '\n')
          ++nl;
      if (c == ' ' || c == '\n' || c == '\t')
        state = OUT;
     else if (state == OUT) {
      state = IN;
      ++nw;
   }
 }
 cout << nl << " " << nw << " " << nc << endl;

注意C++版本只有单层循环,虽然在#0貌似公正的开辟了同样大小的4K buffer,但是每一个字节的获得都是通过sbumpc()函数,调用一次读取一个字节,sbumpc大概其中的逻辑是什么呢?首先要判断是否读到内部缓冲区尾了,如果没有,那么递增一个指针,如果读到尾了,那么进行系统调用更新buffer。光其中if语言的开销就惊人。

而Java版本就通过一个read函数调用,直接将不多于4K的数据从流中读取到本地buffer中,然后进行内层循环。
这样对于C++的版本,虽然对OS底层的系统调用和Java一样多,但是函数调用的次数开销几乎是Java的4000倍。
即一个8K的文件,Java调用两次read,然后进入内层循环,C++调用8000次sbumpc()函数,不调用内层循环。

作人要厚道啊............

本文地址:http://com.8s8s.com/it/it23780.htm