Rails Time.now.at_beginning_of_month 耗时问题

zwyan2009 · 2015年02月09日 · 最后由 zwyan2009 回复于 2015年02月12日 · 2500 次阅读

最近遇到个诡异的问题。

本机 mac 10.9 ruby 2.2.0 Rails 4.2.0 costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000 => 0.0939369201660156

服务器 Ubuntu 12.04 ruby 2.2.0 Rails 4.2.0 costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000 1.925826072692871

两者时间相差太大,服务器上此方法耗时太长,而且代码中使用了大量这样的代码。影响性能。 各位大牛有没有什么思路。

注:各位机器上的耗时是多少啊?

需要这么高的性能啊?是不是可以考虑不用 ruby.

服务器的 cpu 有些性能非常非常低,特别是 vps,连跟奔 4 的 CPU 都没得比

@debugger 嗯,历史遗留系统。重做肯定不会使用 ruby 了。

@cxh116 我们自己服务器很好的

#4 楼 @zwyan2009 可以把两台机器 cpu 的型号贴出来吗?

i3 CPU M 380 @ 2.53GHz

costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
 => 0.234701

@cxh116 mac: intel i5, ubunutu: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz

#6 楼 @zwyan2009 系统是直接装在物理机上面,还是有虚拟化? 如果有虚拟机,有没有限制 cpu 的使用频率?

Benchmark.bm { |x| x.report {1000.times { Time.now.at_beginning_of_month } }} 这样写会不会好点

@cxh116 是虚拟机,具体不是特别清楚,得去问问运维。

用过 vmware esxi 的管理界面,可以把机器的主频限制为 1Ghz

Ubuntu14.04 ruby2.0 rails4.0.2 2 Intel(R) Pentium(R) CPU G620 @ 2.60GHz

[1] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 106.140972
[2] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 0.101006
[3] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 0.123881
[4] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 0.085452
[5] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 0.088573
[6] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 0.0849
[7] pry(main)> costs = Benchmark.realtime {Time.now.at_beginning_of_month} *1000
=> 0.087018

1000 次操作还不到 2 秒,平均一次 2 毫秒,这性能还想压榨...

#12 楼 @quakewang 也不能这么说吧,这也是一种很合理的追求。不过 ruby 的话,确实不太讲究这个。

@quakewang 一言难尽 我们系统对这个要求很高的

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