• Cloudflare CDN速度还能接受

  • #5楼 @davidwei 看来我想当然了,不过这也只能怪Ruby自己了,Array#& 是C实现的,而 Set模块是用Ruby实现的…一个比Array更需要高效率的场景反而用Ruby写 😢

    不过你的测试代码不太好,集合太小,并且不是随机数据,Array#include?理论是比Set#include?慢的,但看Ruby源码,Array#& 方法已经将数组转换成 hash 再求并集的,所以求交集并集能和Set(数据结构意义上的Set,Ruby中的Set模块太令人失望了)一样高效。

    看下面测试:

    require 'benchmark'
    require 'set'
    GC.disable 
    
    ary = (1..1000).to_a.shuffle
    subary = (1..100).to_a.shuffle
    set = Set.new(ary)
    subset = Set.new(subary)
    iterations = 2000
    
    Benchmark.bm do |bm|
      bm.report("Array all? and include?\n") do
        iterations.times { subary.all?(&ary.method(:include?)) }
      end
    
      bm.report("Set all? and include?  \n") do
        iterations.times { subset.all?(&set.method(:include?)) }
      end
    
      bm.report("Array & and any?       \n") do
        iterations.times { (ary & subary).any? }
      end
    
    end
    
    

    输出:

           user     system      total        real
    Array all? and include?
      2.900000   0.000000   2.900000 (  2.900707)
    Set all? and include?  
      0.030000   0.000000   0.030000 (  0.038133)
    Array & and any?       
      0.110000   0.000000   0.110000 (  0.112873)
    
    

    理论上最高效的方法是:

    subset.all?(&set.method(:include?))
    

    但鉴于Set模块是Ruby代码实现的,集合不大的情况下,还是楼主的(arr & subary).any? 实际速度最快 😪

  • #3楼 @tini8 uniq之后还是数组啊,求交集并集还是低效(Ruby中Array#&之类的求交集并集方法内部是用的Hash),Set#include? 方法复杂度是O(1),数组的是O(n)啊

  • a = [1,2,3,4,5]
    subset = [1,2,4]
    subset.all? &a.method(:include?)
    
    # 或者
    require('set')
    Set.new(subset).subset? Set.new(a)
    
    

    如果求交并集场景较多,还是先转换成Set更高效

  • 但是默认进入的第一页确实是个问题哈,或者默认第一页是最久远的评论?用户体验不太好啊。如果要预先读出共有几页,又要多耗计算资源

  • 对了,我的PlainSite就是采用倒序字母编号的分页,这样当新文章发布时,旧的列表页面的URL不会改变。

    因为文章是按时间从近到远排序的,第一页是最新的文章,所以最后一页的URL是a.html,倒数第二页的URL是b.html。 如果用数字分页,则可以let count = pages.length,第一页的URL是page/#{count},第二页是page/#{count-1}

    https://ruby-china.org/topics/22876

  • 同不喜欢无限加载的展现形式!分页大法好!!!!

  • Clojure 中文社区的地址 at 2015年09月10日

    楼主题叶好像是社区挖坑狂,各大冷门语言的中文社区都被抢注了

  • #8楼 @kamehamehon 但是我根本找不到在哪里设置我的Github