我有以下代码,基本上计算了参数化的执行时间:
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
的第一次调用很慢:
- 加载 unicode 数据库加上规范化需要 70 多 毫秒
- 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/