• Groovy中那些神奇注解之Memoized


    临近年关手头比较闲,去看了一下Groovy的官方文档,才发现原来Groovy中带了那么多的注解,很多注解带来的效果,有时候让人感觉“这不是在变魔法吧”。

    个人很喜欢Groovy,写不成Ruby,Groovy一样让我很愉悦。可惜在国内Groovy实在没什么人气,连个像样的官方站都没有,或许是因为喜欢脚本的都在写ruby,python,写Java的又对他不屑一顾?

    接下来的一系列文章,就只介绍一些我个人觉得很好用,在开发中用到机会会比较多的注解。

    PS:强烈推荐Groovyr官方文档,相当的详细,地址:http://www.groovy-lang.org/documentation.html,不用担心是英文,有点代码经验的,一看示例代码就知道是什么意思了。

    好了,闲话少说,第一个注解:Memoized

    Memoized的全称是:groovy.transform.Memoized,在groovy.transform包下,有很多相关的注解,可以好好了解一下

    至于Memoized的作用,看名字就很明白了,就是“记住”,没错,就是把方法的执行结果缓存起来,下次调用时,如果参数一样,那方法就不再计算而是直接返回结果了,该注解对于那些参数范围比较少,并且只要参数一定,那么结果肯定也是唯一的方法,有着很好的加速效果。

    举个最简单,但是个人觉得最能体现Memoized效果的例子,大家应该都实现过用递归方式实现斐波那契(fibnacci)数列吧,但是纯粹的不加优化的递归方式是相当相当的没效率的,在我的电脑上,计算到40左右,电脑就有点跑不动了,看看代码:

    class Fibnacci{
        long total = 0 //用来统计一共计算了多少次
        int n //计算多少的数列
        
        public Fibnacci(int n){
            this.n = n
        }
    
        def fibnacci_1(n){
            total ++
            n < 2 ? 1 : fibnacci_1(n-1) + fibnacci_1(n-2)
        }
        
        @groovy.transform.Memoized
        def fibnacci_2(n){
            total ++
            n < 2 ? 1 : fibnacci_2(n-1) + fibnacci_2(n-2)
        }
    
        //测试不使用Memoized
        def runWithoutMem(){
            long start = System.currentTimeMillis()
            total = 0
            def val = fibnacci_1(n)
            long time = System.currentTimeMillis() - start
            println "未使用Memoized,${n}的Fibnacci值是${val},共用时${time}毫秒,函数调用共${total}次"
        }
        
        //测试使用Memoized
        def runWithMem(){
            long start = System.currentTimeMillis()
            total = 0
            def val = fibnacci_2(n)
            long time = System.currentTimeMillis() - start
            println "使用Memoized,${n}的Fibnacci值是${val},共用时${time}毫秒,函数调用共${total}次"
        }
    }
    
    def fib = new Fibnacci(40)
    fib.runWithoutMem()
    fib.runWithMem()
    

      

    fibnacci_1和fibnacci_2方法实现是完全一样的,唯一的不一致就是一个加上了注解,同时我在类里面加上了一个变量total,来统计方法一共被调用了多少次,把上面的代码复制到Groovy自带的GroovyConsole程序中(神器呀),直接就可以运行,看看结果:

    结果很惊人吧,因为Memoized把计算的结果缓存下来了,如果参数一样就不用再重复计算了,所以效率自然大大提高,这就好像我们用数组方法来实现fibnacci从而提高效率原理是差不多的,不过这样小小的一个注解,可以少写好多代码省不少事了:)

    好了,就到这里了,休息,休息一下

    
    
  • 相关阅读:
    2018年奇虎360春招笔试题--玫瑰花
    MaxPooling的作用
    网易笔试编程题:被3整除
    网易笔试编程题:牛牛找工作
    剑指offer 第十二天
    算法题:合并N个长度为L的有序数组为一个有序数组(JAVA实现)
    十分钟看懂神经网络反向传输算法
    十大经典排序算法最强总结(含JAVA代码实现)
    记服务器中招挖矿病毒排查过程(解决方案篇)
    spring 事件监听同时支持同步事件及异步事件
  • 原文地址:https://www.cnblogs.com/varlxj/p/5181703.html
Copyright © 2020-2023  润新知