ruby-on-rails - 为什么parameterize第一次执行的时候特别慢

标签 ruby-on-rails ruby

我有以下代码,基本上计算了参数化的执行时间:

require 'active_support'
require 'active_support/core_ext'

for x in 0..10
  ss = Array.new(1000, "Book Author Title")
  st = Time.now
  ss = ss.map {|s| s.parameterize}
  et = Time.now
  p "parameterize 1000 simple strings takes #{'%.4f' % ((et - st)*1000)} milliseconds"
end
# p ss

但是我得到了输出,比如:

"parameterize 1000 simple strings takes 219.5780 milliseconds"
"parameterize 1000 simple strings takes 74.3870 milliseconds"
"parameterize 1000 simple strings takes 73.9830 milliseconds"
"parameterize 1000 simple strings takes 76.3160 milliseconds"
"parameterize 1000 simple strings takes 65.7620 milliseconds"
"parameterize 1000 simple strings takes 78.5280 milliseconds"
"parameterize 1000 simple strings takes 89.2950 milliseconds"
"parameterize 1000 simple strings takes 90.6750 milliseconds"
"parameterize 1000 simple strings takes 93.8500 milliseconds"
"parameterize 1000 simple strings takes 74.2330 milliseconds"
"parameterize 1000 simple strings takes 86.2160 milliseconds"

第一次执行的时候比下面的要贵那么多,我想明白为什么会这样。

谢谢大家!

最佳答案

简答: ActiveSupport::Inflector#parametrize 的第一次调用最终加载了 unicode 数据库 here .这会增加 70 多毫秒的开销,这也是第一次调用速度较慢的主要原因。

长答案: 由于以下原因,"Book Author Title".parametrize 的第一次调用很慢:

  1. 加载 unicode 数据库加上规范化需要 70 多 毫秒
  2. I18n.transliterate("Book Author Title") 在第一次调用时会在 10-15 毫秒内进行翻译并缓存响应。后续调用返回缓存值,这需要 0.002 毫秒。

以下是加载 unicode 数据库的调用序列:

ActiveSupport::Inflector.parametrize ->
 ActiveSupport::Inflector.transliterate ->
  ActiveSupport::Multibyte::Unicode.normalize ->
   https://github.com/rails/rails/blob/v5.2.3/activesupport/lib/active_support/multibyte/unicode.rb#L340

尝试下面的代码片段来验证。

require 'active_support'
require 'active_support/core_ext'
def benchmark_normalize(s)
  st = Time.now
  ts = ActiveSupport::Multibyte::Unicode.normalize(s, :c)
  et = Time.now
  p "takes #{'%.4f' % ((et - st)*1000)} milliseconds"
end
benchmark_normalize("Book Author Title")

关于ruby-on-rails - 为什么parameterize第一次执行的时候特别慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57172750/

相关文章:

javascript - 如何将整数数组转换为人力车的 x/y 坐标

ruby - 使用 Test::Unit,如何在所有测试(但不是每个测试)之前运行一些代码?

ruby - 为什么我的 Puppet 模板返回 true 而不是 awk 的输出?

javascript - ruby on Rails - 无法运行javascript

ruby-on-rails - 您如何保持业务规则 DRY?

ruby-on-rails - Rails 4 - 语法错误,意外的 tIDENTIFIER,期望输入结束

ruby - 如何将简单的时间字符串解析为时间段?

ruby-on-rails - Rails 3.1 Assets 管道和缓存

ruby-on-rails - Ruby on Rails 使用 rake 任务解析 JSON 文件

jquery - FullCalendar 仅在重新加载时出现