我正在优化对性能敏感的 TTL 缓存。分析器表示,大约 25% 的时间Time.now
用于Time#to_f
计算生存时间。
有没有一种可靠的方法以简单的数字形式(以任何粒度)而不是花哨的Time
对象来获取 Ruby MRI 中的当前时间?
我正在优化对性能敏感的 TTL 缓存。分析器表示,大约 25% 的时间Time.now
用于Time#to_f
计算生存时间。
有没有一种可靠的方法以简单的数字形式(以任何粒度)而不是花哨的Time
对象来获取 Ruby MRI 中的当前时间?
从您的问题中,您真正需要什么样的性能,或者为什么您的代码无法提供这种性能水平,并不清楚。对于大多数用例,MRI 的性能相当不错。如果您有一个特殊的用例,并且下面的建议都不适合您,那么您可能需要重新审视代码中的假设,或者确定 Ruby 解释器是否真的是需要微秒级性能的工作的正确工具或纳秒范围。
Ruby 通常不具备最快的代码执行速度,但它通常“足够快”。在我的系统上,MRI平均在约 2 毫秒内返回 1,000 个时间对象。例如,MRI 报告:
require 'benchmark'
Benchmark.measure do 1_000.times { t = Time.now.to_f } end
=> #<Benchmark::Tms:0x00000000be2f30
@cstime=0.0,
@cutime=0.0,
@label="",
@real=0.001831756,
@stime=0.0,
@total=0.0,
@utime=0.0>
我始终得到大约在微秒范围内的基准时间200.times
。这表明一些值得考虑的事情:
换句话说,您也许可以重新考虑您的问题,以便 Ruby 部分对时间不那么敏感。Ruby 有很多特性使其能够与其他进程和应用程序进行通信,并且使用进程间通信可以帮助您异步执行必要的操作。
假设您使用的是 Unixish 系统(Linux 或 OSX),您可以执行以下操作:
time = `date +%s`.squish.to_i