rails - 数字比较与文本比较的速度要快多少

时间:2011-07-27 19:20:14

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

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

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

/ EDIT

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

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

    @matches.reverse!

2 个答案:

答案 0 :(得分:7)

简而言之,我认为数字比较会更快,因为比较字符串是关于比较字符后的字符(建议:在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)

答案 1 :(得分:3)

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

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

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

解决明显的性能问题,然后继续对各种解决方案进行基准测试(但请确保将sortsort_by进行对比,以确保“明显”与现实相符。