最近上CSDN比较多,又看到说Java比C++更快的帖子。
Java在某些情况下比C++快我认为是很有道理的。例如可以根据特定的CPU进行优化等等。
有位叫 wingfiring(别逗了)(非典型秃子) 的老兄发了一个帖子,原文如下:
好,我没那么多时间吵C++好还是Java好,所以,我就先瞻仰一下楼主给出的链接吧,
第一个:
里面有两段代码
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()函数,不调用内层循环。
作人要厚道啊............