随着互联网的发展,虽然计算机的计算能力每年都在飞快增长,价格也在不断下降。但是我们需要处理的信息量更是呈指数级的增长。对于相同的需求,相同的数据基础,不同的算法,所消耗的时间和计算机空间是不一样的,当然消耗时间越短,空间越小的代码越优秀,下面我们来看一个简单需求(求和1-100 000 0000)的代码实现。
/**
* 方式一:求和1-100 000 0000
*/
@Test
public void getSum1() {
Runtime r = Runtime.getRuntime();
r.gc();
long startMem = r.freeMemory();
long startTime = System.currentTimeMillis();
long result = 0;
for (long i = 1; i <= 1000000000L; i=i+1L) {
result+=i;
}
long endTime = System.currentTimeMillis();
long endMem = r.freeMemory();
System.out.println("方式一:求和1-1000000000的结果为"+result+",耗时"+(endTime-startTime)+"毫秒"+",消耗内存"+(startMem-endMem)+"字节");
}
运算结果:
方式一:求和1-1000000000的结果为500000000500000000,耗时471毫秒,消耗内存21453824字节
/**
* 方式二:求和1-1-100 000 0000
* 解:设
* x=1+2+..+(n-1)+n
* y=n+(n-1)+...+2+1
* 所以:
* x+y=(1+n)+(2+n-1)+...+(n-1+2)+(n+1)
* 2x=(n+1)+(n+1)+...+(n+1)+(n+1)
* 2x=n(n+1)
* x=n(n+1)/2
*/
@Test
public void getSum2() {
Runtime r = Runtime.getRuntime();
r.gc();
long startMem = r.freeMemory();
long start = System.currentTimeMillis();
long i=1000000000;
long result = (i*(i+1))/2;
long end = System.currentTimeMillis();
long endMem = r.freeMemory();
System.out.println("方式二:求和1-1000000000的结果为"+result+",耗时"+(end-start)+"毫秒"+",消耗内存"+(startMem-endMem)+"字节");
}
运算结果:
方式二:求和1-1000000000的结果为500000000500000000,耗时0毫秒,消耗内存0字节
通过对两种方式运行结果的观察,同样是求解1-100亿的和,两段代码所消耗的运行时间却有很大的差别,显然方式二更好些
版权声明:本文为lazy_cat_go原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。