瞎扯淡 还能再慢点不?!

mimosa · 2012年03月21日 · 最后由 mimosa 回复于 2012年03月22日 · 3057 次阅读

过滤筛选规则:

如果你只是发这个... How can we help you? ;)

#1 楼 @poshboytl 的确,这个帖子我看着也觉得有 show off 的嫌疑,但是我不确定,因为没有看出什么地方是可资炫耀的。

漫漫长夜,无心睡眠,我以为只有我睡不着觉, 原来,大家都没看懂。

我觉得 lz 只是来吐槽一下?...

不能,楼主强,怎么才能做到这么慢呢。

楼上四位 都是精力旺盛型的,凌晨 1~2 点了还不睡。 :>

做了一个坑爹的规则过滤表,去过滤交易记录:

trades.each do |t|  
  t.orders.each do |o| 
    filter_list.each do |filter|
      outer_ids = filter.outer_ids
      max = filter.price_max.to_i
      min = filter.price_min.to_i
      unless outer_ids.empty?
        if outer_ids.include?(o.outer_iid) # 商家编码过滤
          if max > 0 || min > 0 # 价格过滤
            执行累加方法 if o.payment >= min  && o.payment <= max
          else
            执行累加方法
          end
        else
          if max > 0 || min > 0 # 价格过滤
            执行累加方法 if o.payment >= min  && o.payment <= max
          end
        end
      end
    end
  end
end

#7 楼 @mimosa 你先搞清楚慢在哪里,如果是 sql,找出 sql 和对应的运行时间,如果是 ruby,用 profiler 找到运行次数较多时间较长的代码。

我是把集合先取出来,用 ruby 循环计算后生成 hash 的,跟 SQL 没关系。

#9 楼 @mimosa 你这个时间复杂度是 O 3 次方,先把复杂度杂下来吧。搞成 2 个 O2 也要好点吧。

数据结构不能变,有万恶的合并支付,所以必须取 order 中的 outer_iid 才准确:

class Trade
  include Mongoid::Document
  # Embedded
  embeds_many :orders   # 订单
  embeds_one  :shipping # 快递

跟数据结构有毛关系,你把那个 3 层循环拆成 2 个两层肯定是可行的,orders,filter_list 两个先比,找出符合条件的再和 trades 算帐。

#11 楼 @mimosa 晕。。。那你这个 t.orders 还是会查 sql 的啊。

#13 楼 @hhuai 多谢了~ t.orders 是 embeds_many 不会 SQL,filter_list 被 SQL 了 orders.count 次,所以慢~~

不会写程序,害死人呀~~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号