【问题标题】:rails - how much faster are number comparisons vs text comparisonsrails - 数字比较与文本比较快多少
【发布时间】:2011-07-27 19:20:13
【问题描述】:

我的模型中有一个非常昂贵的方法,它可以比较多个项目的数组文本项。

它运行真的很慢。如果我使用关系数据库表并仅比较 ID,我的方法会运行得更快吗?

/编辑

我正在尝试对以下内容进行基准测试:

 @matches = @location_matches.sort do |l1, l2|
      l1.compute_score(current_user) <=> l2.compute_score(current_user)
    end

    @matches.reverse!

【问题讨论】:

  • 请发布您的模型示例。目前太模糊了。

标签: mysql sql ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

简而言之,我猜数字比较会更快,因为比较字符串是关于逐个字符进行比较(建议:在 Ruby 中尽可能使用符号,它们的比较要快得多)。

无论如何,您都会找到there,您需要进行基准测试并获得详细结果。

代码示例:

require 'benchmark'

n = 50000
Benchmark.bm do |x|
  x.report("for:")   { for i in 1..n; a = "1"; end }
  x.report("times:") { n.times do   ; a = "1"; end }
  x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
end

结果:

                user     system      total        real
   for:     1.050000   0.000000   1.050000 (  0.503462)
   times:   1.533333   0.016667   1.550000 (  0.735473)
   upto:    1.500000   0.016667   1.516667 (  0.711239)

【讨论】:

  • @mu 太短了:啊哈!我通常更喜欢学习钓鱼而不是被喂食:)
  • 我知道,我很烂 :|但我发布了我的代码,我将如何对其进行基准测试?谢谢大家
  • @masedesign:你绝对不烂,你正在学习并问自己很好的问题,这就是要遵循的道路。我建议您在 Rails 控制台中使用基准测试,以便加载整个环境。
  • @masedesign:还在等待答案吗?
【解决方案2】:

您的第一个任务是将 sort 替换为 sort_by,您也可以通过首先按所需顺序对事物进行排序来跳过 reverse!:

@matches = @location_matches.sort_by { |loc| -loc.compute_score(current_user) }

sort 方法在排序时必须进行多次比较,并且每次比较都需要两次 compute_score 调用,sort_by 方法在内部执行 Schwartzian Transform,因此您昂贵的 compute_score 每个条目只会被调用一次.块内的否定只是颠倒排序顺序的一种简单方法(我假设您的分数是数字)。

修复明显的性能问题,然后继续对各种解决方案进行基准测试(但请务必对 sort 与 sort_by 进行基准测试,以确保“明显”与现实相符)。

【讨论】:

  • 非常感谢,这很有帮助。原来我的问题是:listing_location.distance_from(user_location, :units=&gt;:miles) &gt; distance.to_f ? nil : listing geokit 使用它来确定距离。 Bleh,似乎无法修复。
  • @masedesign:这可能是在内部执行haversine。如果你只关心一个小半径,一个简单的欧几里得度量(甚至曼哈顿度量)作为一个近似值可能足以过滤事物,然后使用一个更小的集合来获得真正的距离。
猜你喜欢
  • 2013-05-06
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多