如果您因为分心而失去了大量时间,并希望开始将更多时间花在重要的事情上,您可以从个人时间跟踪工具(如 RescueTime、Toggle 或 Daily)开始,以衡量和了解您的时间去向。当我在一个应用程序上工作时,我经常发现自己想要我的代码同样的东西:更多的时间花在我关心的事情上,更少的时间浪费在重复低价值的活动上。有时,在等待命令完成或测试通过时,我会问自己这似乎太慢了,我的电脑时间都去哪儿了?我们已经有很多用于类似任务的工具。如果您已经知道需要优化哪个关键代码路径,则可以单独针对它重复运行 Benchmark。或者,如果您想扫描整个系统的问题区域,您可以使用分析器来照亮资源最密集的操作。如果您只是想知道哪些请求和查询花费了太多时间,您可以注册十几个应用程序性能监控服务中的任何一个。相对而言,这个 API 端点是否花费更多时间查询数据、转换数据或通过网络响应?如果将不相关的操作(如慢速网络请求或数据库插入)隔离开来,新的 XML 解析器如何针对不同大小和类型的文件执行?如果没有自定义计时代码或侵入性的运行时自省,像这样的问题通常很难回答,其中任何一种都可能无意中影响系统的行为和性能——这正是您要测量的东西!所以这就是我们制作 time_up 的原因,这是一个新的 Ruby gem,可帮助您跟踪代码的时间去向。而且很容易使用!如果您曾经使用过秒表 ⏱,您就会确切地知道如何处理 README 的 mereskim。
安装并需要 gem 后,您就可以开始测量应用程序的时间了!一种简单的入门方法是将计时器名称和块传递给 TimeUp.start,如下所示:transactions = Transaction .where( user: @user) # `TimeUp.start` 将返回块评估的任何内容 tomonthly_spending = TimeUp .start ( :processing) { Categoriesd_transactions = group_by_category(transactions)arrange_by_month(categorized_transactions)}payments = PaymentFinder .find(@user,monthly_spending)render json:present_summary(支出:monthly_spending,payments:payments)当你调用TimeUp.elapsed(:processing)你会得到一个 Float 返回值,表示 :processing 计时器运行时已经过去了多少秒。就像面积秒表一样,它会计算运行时经过的总秒数,即使你多次启动和停止它(也就是说,除非你调用 TimeUp.reset)。 process_timer = TimeUp .start(:processing)categorized_transactions = group_by_category(transactions)monthly_spending =arrange_by_month(categorized_transactions)process_timer .stop # 以秒为单位返回总经过时间 TimeUp 的大部分模块方法在每个定时器实例上都可用,因此 process_timer.elapsed给你结果。 gem 提供了许多用于控制计时器(停止、启动、重置)、检查其状态(活动?、TimeUp.active_timers)和收集基本统计信息(如计数、最小值、最大值、平均值、中值和百分位数)的方法。 README 中概述了完整的 API。但是 time_up 真正擅长的地方在于分别对不同的活动进行计时,因此您可以粗略比较您的应用程序花费时间的相关方面。它看起来有点凌乱,但继续这个例子,我们可以通过使用多个计时器按代码行为的每个类别划分我们的度量:
交易 = TimeUp .start( :querying) { Transaction .where( user: @user)}process_timer = TimeUp .start( :processing)categorized_transactions = group_by_category(transactions)monthly_spending =arrange_by_month(categorized_transactions)process_timer .stoppayments = TimeUp .start( querying) { PaymentFinder .find(@user,monthly_spending)}render json: TimeUp .start(:presenting) {present_summary(plys:monthly_spending, Payments: Payments)} 无论你是为一个只运行一次的脚本计时还是重复调用这些块在像 Web 应用程序这样的长期进程中,您创建的所有计时器都将在进程的整个生命周期中持久存在于内存中。一旦你记录了一段时间,你可能想知道一切都花了多长时间!如上所述,gem 提供了许多方法来检查 TimeUp 模块和每个计时器实例上可用的计时器: > TimeUp .elapsed( :presenting) => 1 。 0050 820000469685 > query_timer = TimeUp .timer(:querying) > query_timer .count => 2 > query_timer .timings => [ 0 . 5051469999598339, 0 . 8050760000478476 ] > query_timer .min => 0 。 5051469999598339 > query_timer .max => 0 。 8050760000478476 > query_timer .mean => 0 。 6551115000038408 > TimeUp .total_elapsed => 2 。 822688000043854 > TimeUp .all_stats => { :querying =>{ :elapsed => 1 。 3102230000076815, :count => 2, :min => 0 。 5051469999598339, :max => 0 。 8050760000478476, :mean => 0 。 6551115000038408}, :processing =>{ :elapsed => 0 。 5073829999892041, :count => 1, :min => 0 。 5073829999892041, :max => 0 。 5073829999892041, :mean => 0 。 5073829999892041}, :presenting =>{ :elapsed => 1 。 0050 820000469685, :count => 1, :min => 1 。 0050 820000469685, :max => 1 。 0050 820000469685, :mean => 1 。 0050 820000469685}} 由于想要打印结果是很常见的,gem 提供了几种方法来快速输出所有定义的计时器的状态。如果您只执行一次计时的代码,您可以使用 TimeUp.print_summary 打印简单的经过时间摘要:
如果您正在对重复调用的代码的行为进行计时(如在控制器操作或测试助手中),您可以打印一个更详细的表格,其中包括使用 TimeUp.print_detailed_summary 为每个命名计时器记录的所有计时的基本统计信息:> TimeUp .print_detailed_summary ================================================ ================================ 姓名 |已过 |计数 |敏|最大 |意思 |中位数 |第 95 % ------------------------------------------------ --------------------------------- :querying | 1 . 31028 | 2 | 0 . 50520 | 0 . 80507 | 0 . 65514 | 0 . 65514 | 0 . 78221:处理| 0 . 50314 | 1 | 0 . 50314 | 0 . 50314 | 0 . 50314 | 0 . 50314 | 0 . 50314 :呈现| 1 . 0050 8 | 1 | 1 . 0050 8 | 1 . 0050 8 | 1 . 0050 8 | 1 . 0050 8 | 1 . 0050 8 如果你打算在一个漫长而混乱的过程中穿插你对 TimeUp 的使用,比如运行你的所有测试,那么在 at_exit 钩子中打印你的结果可能是最简单的。如果你想将它们输出到自定义记录器,两者都是方法接受 IO 参数。 time_up gem 是用于简单工作的简单工具。希望您下次发现自己想知道复杂操作的哪些部分花费最多时间时会记住它。如果您有任何问题或想法,请随时打开问题或在 Twitter 上联系我们!你是在家里,还是在你最喜欢的咖啡馆,也许穿着拖鞋?让我们帮助您保持这种状态。加入我们