• 一个demo告诉你优化算法的强大


    这里的demo是一个累加算法,如1,2,3,4.....n

    即:sum = 1+2+3+4......+n;

    我们可以这样做:

     1 /**
     2      * 循环实现累加方法
     3      * @param value
     4      * @return
     5      */
     6     private static long cycle(long value) {
     7         long sum = 0;
     8 
     9         for (long i = 1,v = value; i <= v; i++) {
    10             sum += i;
    11         }
    12         return sum;
    13     }

    另一种方法(高斯方法):

     1 /**
     2      * 高斯方法:<code>(n+1)*n/2</code><br>
     3      * you can read more from <a href="http://zhidao.baidu.com/question/411055258.html">Here</a>
     4      * @param value 
     5      * @return
     6      */
     7     private static long gaosi(long value) {
     8         long sum = 0;
     9         sum = (value + 1) * value / 2;
    10         return sum;
    11     }

    我们可以写一个demo来测试他们的差别:

     1 /**
     2  * 
     3  */
     4 package com.b510.arithmetic;
     5 
     6 /**
     7  * 累加算法实现<br>
     8  * 
     9  * @date 2013-4-16
    10  * @author hongten
    11  * 
    12  */
    13 public class AddArithmetic {
    14 
    15     /**
    16      * 循环实现累加方法
    17      * @param value
    18      * @return
    19      */
    20     private static long cycle(long value) {
    21         long sum = 0;
    22 
    23         for (long i = 1,v = value; i <= v; i++) {
    24             sum += i;
    25         }
    26         return sum;
    27     }
    28 
    29     /**
    30      * 高斯方法:<code>(n+1)*n/2</code><br>
    31      * you can read more from <a href="http://zhidao.baidu.com/question/411055258.html">Here</a>
    32      * @param value 
    33      * @return
    34      */
    35     private static long gaosi(long value) {
    36         long sum = 0;
    37         sum = (value + 1) * value / 2;
    38         return sum;
    39     }
    40     
    41     public static void main(String[] args) {
    42         //清理一下内存,但不一定会执行
    43         System.gc();
    44         // you should change value,then get the different results
    45         long value = 10000000;
    46         long sum = 0;
    47         long start = System.currentTimeMillis();
    48         sum = cycle(value);
    49         long end = System.currentTimeMillis();
    50         System.out.println("使用循环累加方法从[1]累加到["+value+"]用时 : ["+(end - start) + "]ms,结果:"+ sum);
    51         //清理一下内存,但不一定会执行
    52         System.gc();
    53         start = System.currentTimeMillis();
    54         sum = gaosi(value);
    55         end = System.currentTimeMillis();
    56         System.out.println("使用高斯方法从[1]累加到["+value+"]用时 : ["+(end - start) + "]ms,结果:"+ sum);
    57         
    58     }
    59     
    60 }

    你可以改变main方法中的value的值,来测试他们所消耗的系统时间....

    当然不同配置的机器运行结果是不一样的...

    我机器运行情况:

    使用循环累加方法从[1]累加到[10000000]用时 : [24]ms,结果:50000005000000
    使用高斯方法从[1]累加到[10000000]用时 : [0]ms,结果:50000005000000
  • 相关阅读:
    徒手画个disk不容易啊。。。
    fast powf
    SSE sqrt还是比C math库的sqrtf快了不少
    Mongoose也是个大坑
    A tiny program to benchmark image transpose algorithms
    On extracting ops from LLVM backend
    Into concurrent LRU caching once again
    性能大坑
    多项式在线拟合神器
    Spark 1.6.1源码编译
  • 原文地址:https://www.cnblogs.com/hongten/p/hongten_addarithmetic.html
Copyright © 2020-2023  润新知