ruby数组自带方法与自定义方法的性能测试集+1个循环问题
2013-03-16 19:30
513 查看
n=[1,2,3,nil,nil] p n n1=n.compact p n1 n2=n.compact! p n2 p n
主要是交流,水平有限,喜欢研究,多多包涵。
先说一个数组循环问题
arr=[1,2,3] n=arr << arr p n 输出: [1, 2, 3, [...]]
分析:
<< 传进去的是一个arr指针 # =>[1,2,3,arr]
其实这是一个循环,真实的值是:[1,2,3,[1,2,3,[1,2,3,[1,2,3,........]]]
arr[3]=arr
arr[3][3]=arr
ruby数组比较常用的方法:
1.at方法
arr=[1,2,3] p arr.at(2) p arr[2]
其实:at比[]方法要效率一点,因为它不接受range参数
测试:
require 'benchmark' n=(1..1000000).to_a l=n.length Benchmark.bm do |bm| bm.report("at") do i=0 while i< l n.at(i) i+=1 end end bm.report("[]") do i=0 while i< l n[i] i+=1 end end end 输出: user system total real at 0.610000 0.000000 0.610000 ( 0.609000) [] 0.625000 0.000000 0.625000 ( 0.625000)
结论:大数组的获取元素首选at
2.compact delete方法
n=[1,2,3,nil,nil] p n n1=n.compact p n1 n2=n.compact! p n2 p n
删除数组中nil的元素,带!返回数组本身,如果数组中没有nil,不带!返回Nil,带!返回数组本身。
n=[1,2,3,nil,nil] p n.delete(nil) p n
delete方法也可以删除所有nil元素,比较下性能:
require 'benchmark' n=Array.new(100000000,nil) n1=Array.new(100000000,nil) Benchmark.bm do |bm| bm.report("delete") do n.delete(nil) end bm.report("compact") do n1.compact end end user system total real delete 0.718000 0.016000 0.734000 ( 0.735000) compact 1.360000 0.062000 1.422000 ( 1.453000)
结论:删除元素首选 delete
3.比较下for each while
require 'benchmark' n=(1..100000).to_a Benchmark.bm do |bm| bm.report("each") do n.each do |d| d end end bm.report("for") do for i in n i end end bm.report("while") do i=0 while i< n.length n[i] i+=1 end end end user system total real each 0.015000 0.000000 0.015000 ( 0.015000) for 0.016000 0.000000 0.016000 ( 0.016000) while 0.078000 0.000000 0.078000 ( 0.078000)
结论:each 很效率
4.flatten方法
n=[1,2,3] n1=[4,5,6] n2=[n1,n] p n2 p n2.flatten # [[4, 5, 6], [1, 2, 3]] [4, 5, 6, 1, 2, 3]
5.sort与自定义方法比较
require 'benchmark' n=(1..100).to_a n1=(23..89).to_a n2=(900..3003).to_a n=n2+n1+n #自定义方法是网上找的 def bubble_sort(arr) 1.upto(arr.length-1) do |i| (arr.length-i).times do |j| if arr[j]>arr[j+1] arr[j],arr[j+1] = arr[j+1],arr[j] end end end arr end Benchmark.bm do |bm| bm.report("sort") do n.sort end bm.report("personal") do bubble_sort(n) end end user system total real sort 0.000000 0.000000 0.000000 ( 0.000000) personal 3.109000 0.109000 3.218000 ( 3.220000)
结论:坑爹啊,ruby自带方法还是很强大的,首选自带方法sort
6.uniq方法
删除数组的重复元素,测试就不测了,类似于上面的sort.
相关文章推荐
- List<T>泛型数组API自带的Sort() 排序方法根据自定义排序实现
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- java基础之数组的拷贝(自定义方法与System下的自带方法对比)
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- Josephus问题解决方法四(循环数组)
- 数组的循环右移问题(好未来笔试题)
- 动态规划求解连续子数组最大和问题(应该是新的描述方法?)
- PHP循环遍历数组的3种方法list()、each()和while总结
- 4种方法解决为 li列表 添加事件问题(for循环经典问题)
- 当shiro做成动态URL管理时出现循环注入BeanCurrentlyInCreationException的问题解决方法
- ruby中解决mysql中文输入编码问题的简单方法。
- 约瑟夫问题 数组(最好还是用循环指针)
- PHP实现求连续子数组最大和问题2种解决方法
- Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案
- 哪些年遇到过的Andriod问题(十)如何让自定义的方法/类在外部 (别的命名空间) 调用时,鼠标移上去会有提示?
- js对象如何实现数组索引功能并且自定义自己的方法 (4种方法)
- LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
- 完美解决json循环问题(使用javassist增强):Spring MVC中使用jackson的MixInAnnotations方法动态过滤JSON字段
- 最近开发老遇到莫名其妙的问题,dialog自定义大小,setAttributes这个方法没反应是肿么一回事
- 自定义Toast, 重写Toast的makeText方法,解决了重复弹toast问题