`
Anleb
  • 浏览: 31559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ruby数组自带方法与自定义方法的性能测试集+1个循环问题

阅读更多
主要是交流,水平有限,喜欢研究,多多包涵。

先说一个数组循环问题
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.

分享到:
评论

相关推荐

    ruby 数组处理大全.doc

    ruby数组处理大全 如函数名称 说明 示例 &数组与,返回两数组的交集 [1,2] & [2,3] =&gt;[2] *复制数组n次 [1,2]*2 =&gt; [1,2,1,2] +返回两数组的并集,但不排除重复元素 [1,2]+[2,3] =&gt;[1,2,2,3] 追加元素,但不...

    ruby数组

    ruby数组

    Ruby-性能测试(完整版)

    Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试

    Ruby创建数组方法总结

    您可以通过创建一个新的数组对象并将其存储在一个变量中来创建一个空数组。这个数组将为空;您必须用其他变量填充它才能使用它。如果要从键盘或文件中读取内容列表,这是创建变量的一种常见方法。 在下面的示例程序中...

    Ruby-ActiveModel的自定义验证用于检查数组是否包含在另一个中

    Active Model的自定义验证,用于检查数组是否包含在另一个中

    10Ruby 数组.docx

    Ruby是一种动态、面向对象的编程语言,它具有简洁、易读的语法,被称为“程序员最好的朋友”。Ruby具有强大的元编程能力,允许开发者在运行时动态修改和生成代码。Ruby还有一个强大的标准库,提供了丰富的工具和功能...

    Ruby数组(Array)学习笔记

    Ruby中的数组是动态数组,存储的数据不用限定类型,数组的长度是根据存储需要动态扩展,所以,在进行数据定义的时候,只用用最简单的方式new一个Array对象就可以了,可以使用以下几种方式: 代码如下: arr1=[] #最...

    Ruby中数组的一些相关使用方法

    负数索引假设数组末尾—也就是说,-1表示最后一个元素的数组索引,-2是数组中最后一个元素的下一个元素等等。 Ruby的数组可以容纳对象,如字符串,整数,长整数,哈希,符号,甚至其他Array对象。Ruby数组没有在其他...

    ruby 数组使用教程

    你通过在方括号里列出元素并用逗号将它们相互隔开来创建一个数组. Ruby的数组可以适应不同的对象类型 ruby&gt; ary = [1, 2, “3”] [1, 2, “3”] 就像前面提到的字符串一样.数组也可以相乘或相加 ruby&gt; ary...

    Ruby简明教程之数组和Hash介绍

    1. 在Ruby中如何定义数组呢? 使用[ ]来框住元素,而元素之间则使用”,”间隔。如下, 代码如下: name = [“Windy”, “Cindy”, “Amee”, “Tom”] name = [] #声明了一个空数组,未定义的数组 name = [1, ...

    rubyonrails+Ruby+取得指定月日期数方法

    rubyonrails+Ruby+取得指定月日期数的思路方法

    Ruby-DingTalkBot是阿里钉钉自定义机器人的Ruby库

    DingTalk Bot是阿里钉钉自定义机器人的Ruby库

    binary_search:用于Ruby数组的本机和纯Ruby二进制搜索和索引方法

    二进制搜索Ruby的数组 二进制搜索是Ruby的Array类中缺少的一种非常方便的算法。 如果我们知道绝对肯定的是,我们正在与正在工作的数组排序,你可以使用二进制搜索通过数组得多的速度远远超过线性搜索,这与指数进行...

    ruby测试代码1

    ruby测试代码1

    如何用Ruby来实现页面性能测试

    如果已经了解怎么实现页面性能测试,那么本文将带您体会如何用Ruby来实现。为什么选择Ruby来实现,而不是用QTP呢?原因是Ruby有着QTP所无法比拟的优点。

    开放Ruby+watir 自动化测试工具介绍+安装说明

    开放Ruby+watir 自动化测试工具介绍+安装说明

    ruby-warning:添加自定义警告处理

    默认情况下,要求库不更改ruby处理警告的方式,它仅添加允许您自定义处理的方法。 Warning.ignore一个正则表达式和一个可选的路径前缀,并且忽略任何与正则表达式匹配的警告(如果警告以路径前缀开头)。 它也可以...

    针对您的Active Model的自定义验证,用于检查另一个数组中是否包含一个数组-Ruby开发

    Active Model验证交叉点Active Model的自定义验证,用于检查另一个数组中是否包含一个数组。 与ActiveModel中的validates_inclusion_of方法相同,但用于数组比较。 缺点Active Model验证交叉点Active Model的自定义...

    Ruby 方法、类

    Ruby 方法、类 : Ruby 方法、类 ruby-9-method.mp4 ruby-9-method.mp4

Global site tag (gtag.js) - Google Analytics