1

我正在优化对性能敏感的 TTL 缓存。分析器表示,大约 25% 的时间Time.now用于Time#to_f计算生存时间。

有没有一种可靠的方法以简单的数字形式(以任何粒度)而不是花哨的Time对象来获取 Ruby MRI 中的当前时间?

4

2 回答 2

2

TL;博士

从您的问题中,您真正需要什么样的性能,或者为什么您的代码无法提供这种性能水平,并不清楚。对于大多数用例,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。这表明一些值得考虑的事情:

  1. 减少轮询的次数可能会有所帮助。
  2. 使用套接字或管道将来自某个更快进程的数据馈送到 Ruby 中可能是一种有用的方法。
  3. 您可能希望 Ruby 生成一个以 C 速度运行的后台进程。
  4. 您始终可以编写自己的本机扩展。

换句话说,您也许可以重新考虑您的问题,以便 Ruby 部分对时间不那么敏感。Ruby 有很多特性使其能够与其他进程和应用程序进行通信,并且使用进程间通信可以帮助您异步执行必要的操作。

于 2013-10-13T05:58:08.950 回答
-1

假设您使用的是 Unixish 系统(Linux 或 OSX),您可以执行以下操作:

time = `date +%s`.squish.to_i
于 2013-10-13T05:19:33.777 回答