Groovy中那些神奇注解之Memoized
来源:互联网 发布:js新建一个json对象 编辑:程序博客网 时间:2024/05/20 13:05
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程序中(神器呀),直接就可以运行,看看结果:
Result: 未使用Memoized,40的Fibnacci值是165580141,共用时6040毫秒,函数调用共331160281次使用Memoized,40的Fibnacci值是165580141,共用时4毫秒,函数调用共41次
结果很惊人吧,因为Memoized把计算的结果缓存下来了,如果参数一样就不用再重复计算了,所以效率自然大大提高,这就好像我们用数组方法来实现fibnacci从而提高效率原理是差不多的,不过这样小小的一个注解,可以少写好多代码省不少事了:)
亲测 有效
- Groovy中那些神奇注解之Memoized
- Groovy中那些神奇注解之ToString
- 网络中的那些事儿(一)之神奇的通讯
- 那些神奇的工具
- NOI那些神奇的错
- Groovy学习之资料篇
- Groovy 我之初见
- Groovy学习之资料篇
- Groovy探索之Gstring
- Groovy学习之资料篇
- Groovy探索之反射
- Groovy之旅
- Groovy 之文件操作
- Groovy 之 Closure
- groovy之旅
- groovy之范围特性
- groovy之字符串
- groovy之正则表达式
- java删除目录,必须目录为空
- Android-TextView中关键字文字颜色区别于普通文字的实现
- attribute和property的区别
- iOS-字幕滚动
- HTTP与HTTPS
- Groovy中那些神奇注解之Memoized
- protobuff3 protoc命令
- 再看AFNetworking框架
- MySQL的日常使用
- 马拦过河卒 (sdut oj)
- 欢迎使用CSDN-markdown编辑器
- JAVA—Super和this关键字
- 基于How To Tango With Django 1.7的实践(5)——Models and Databases
- Android Things做一个简易相机