Algorithm 版 (精华区)

发信人: Lerry (life is waiting...), 信区: Algorithm
标  题: [合集]JAVA其实并不快。
发信站: 哈工大紫丁香 (2003年10月15日13:51:20 星期三), 站内信件


────────────────────────────────────────
 hewind (研究Java为什么比C/C++快中~~~)  于 2003年10月14日15:16:31 星期二 说道:

终于了找到了前几天JAVA为什么快的原因了,
其实JAVA并不是快,而关键在于计算时间上的失误,
import java.math.BigInteger;
public class add{
    public static void main(String[] args){
        String temp = "1";
        for(int i=2;i<=1000;i++)
            temp +=i;
        BigInteger a = new BigInteger(temp);
        BigInteger b = new BigInteger("0");
        long start = System.currentTimeMillis();
        long stop = 0;
        for(int i=1;i<=100;i++){
            b = b.add(a);
        }
        stop =  System.currentTimeMillis();
        //System.out.println(b.toString());
        System.out.println(stop-start);
    }
}
上面是前几天的JAVA写的加法程序,当时运行速度对超音速与高精度都要快,
令人十分不解,后来发现,被JAVA给骗了。对于加法程序,超音速与高精度的输入
都是字符串,而这个JAVA程序输入却不是字符串,而是BigInteger,而最初的从字
符串到BigInteger的转换被放在了计时函数之外,因此,用这个程序去测试速试是
很不公平的,因为最费时的操作在JAVA中根本就没有计算。这就相当于,对于高精度
,ch2hi的转换是没有计时的。而且最后的结果也是BigInteger,并没有转换成string,
而对于超音速与高精度,最后的结果都是string,因此,JAVA程序也相当于高精度最后
的hi2ch没有计时,因此,JAVA程序要快很多,现在,将这部份纳入计时区,对于JAVA
程序,超音速,高精度,输入数据格式同为string,输出格式同为string进行比较,
改变后的JAVA程序如下:
import java.math.BigInteger;
public class add{
    public static void main(String[] args){
        String temp = "1";
        for(int i=2;i<=1000;i++)
            temp +=i;
        String temp2 = "1" ;
        for(int i=2;i<=1000;i++)    
            temp2 +=i;
        long start = System.currentTimeMillis();
        for( int i = 0 ; i < 1000 ; ++i ){
            BigInteger a = new BigInteger(temp);
            BigInteger b = new BigInteger(temp2);      
            b = b.add(a);
            String res = b.toString() ;
        }
        long stop =  System.currentTimeMillis();
        System.out.println(stop-start);
    }
}
运行结果,
JAVA:42.08 秒
超音速:0.38 秒
高精度:1.932 秒
对于乘法
import java.math.BigInteger;
public class add{
    public static void main(String[] args){
        String temp = "1";
        for(int i=2;i<=1000;i++)
            temp +=i;
        String temp2 = "1" ;
        for(int i=2;i<=1000;i++)
            temp2 +=i;
        long start = System.currentTimeMillis();
        for(int i=1 ; i<=1000 ; ++i){
            BigInteger a = new BigInteger(temp);
            BigInteger b = new BigInteger(temp2);
            b = a.multiply(a);
            String res = b.toString() ;
        }
        long stop =  System.currentTimeMillis();
        System.out.println(stop-start);
    }
}
(注:计算规模与方才加法程序一样)
JAVA: 121.054 秒
超音速:死机! :(
高精度:60.777 秒
由此可见,上次JAVA快的确是被表象所迷惑了,其实相比C/C++,就算JAVA采用了内部优
化,但它还是要比优化的C/C++程序要慢很多!

────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月14日15:20:50 星期二 说道:

长出一口气... ^_^

────────────────────────────────────────
 hewind (研究Java为什么比C/C++快中~~~)  于 2003年10月14日15:22:16 星期二 说道:

呵呵,高精度现在除了加法,应当是最快的了!
准不准备把加法专门优化一下? :P

────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月14日15:24:39 星期二 说道:

你看看转化函数能怎样优化吧 :)

────────────────────────────────────────
 hewind (研究Java为什么比C/C++快中~~~)  于 2003年10月14日15:30:46 星期二 说道:

我想超音速应当对于加法应当是最快的了,已经没有优化空间了,
因为它在ch2hi的过程中就完成了加法运算,以及最后的hi2ch
呵呵,你要是不专门为加法单列一种完成方法,要归入高精度的整体架构,
那一定不能比超音速快啦。
因为,再怎样你都要完成hi2ch,就算你不算相加的时间,
但这时,超音速已经完成计算了

────────────────────────────────────────
 Javor (大哈哈)                       于 2003年10月14日20:16:08 星期二 说道:

//pad

────────────────────────────────────────
 Javor (大哈哈)                       于 2003年10月14日20:51:45 星期二 说道:

盲人摸象

────────────────────────────────────────
 hewind (研究Java为什么比C/C++快中~~~)  于 2003年10月14日22:03:58 星期二 说道:

由表才能及里,
事实胜于雄辩

────────────────────────────────────────
 hjt (浪子小猴◎不会(汇)编)         于 2003年10月14日22:21:55 星期二 说道:

还是用这个定时器吧
#define _mm_time(x) __asm cpuid \
    __asm rdtsc \
    __asm mov dword ptr x,eax \
    __asm mov dword ptr x+4,edx
_int64 startt, endt;
int tt;
_mm_time(startt);
//............
_mm_time(endt);
tt = endt - startt;
这是intel测试软件速度的标准方法,精确到时钟

────────────────────────────────────────
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.865毫秒