这是一个快速的分步指南,适用于您需要即时进行一些性能测试。
Ruby 有一个内置的基准测试模块,该模块易于使用且足够有效,足以涵盖您的标准用例。 使用几个函数之一,我们可以快速隔离代码的非执行部分。
基准报告
Benchmark.bm 方法为我们传递给它的任何代码块提供性能指标的打印输出。 我们可以把它分成多个代码块来执行,一次测试不同的东西。 我们将收到多份报告,每次使用报告方法一份。
Benchmark.bm do |bench| bench.report('Performance Test 1') do # execute some code here end bench.report('Performance Test 2') do # execute some other code here endend
对于本教程,我们将只测试一个代码块:
Benchmark.bm do |bench| bench.report('Testing some code') do # execute some code here endend
这将为我们提供类似于以下内容的输出:
user system total real0.544000 0.036000 0.580000 (1.049005)
每个报告都显示用户 CPU 时间、系统 CPU 时间、总和 CPU 时间和经过的实时时间。
时间单位是秒。
所以我们的代码总共运行了大约 1.05 秒。
让我们更进一步,更彻底地分析我们的代码。
代码分析
我们希望准确了解我们的代码在小样本数据上运行需要多长时间。 然后我们将评估代码在更大的数据池中的执行情况。
Benchmark.bm do |bench| bench.report('Testing some code') do process_100_records endend
让我们运行这个基准测试 5 次并记录结果。
user system total realRun 1: 0.544000 0.036000 0.580000 (1.049005)Run 2: 0.500000 0.080000 0.580000 (1.059239)Run 3: 0.520000 0.048000 0.568000 (1.026662)Run 4: 0.536000 0.048000 0.584000 (1.066434)Run 5: 0.496000 0.080000 0.576000 (1.050087)
我们将平均结果。 您可能希望丢弃您收到的最小和最大运行时间,尤其是当它们明显偏离平均值时。
对于本教程,我们将保留所有 5 个结果。
这是一个快速脚本,用于确定更大数据池的预期运行时间。 对于此示例,我们有 100 条记录的样本大小和 1M 条记录的完整数据大小。
# This code can be run in a terminal - just edit the variablesdef avg(array) array.sum(0.0) / array.sizeenddef seconds_to_hms(sec) "%02d:%02d:%02d" % [sec / 3600, sec / 60 % 60, sec % 60]end# Fill in these variables with your own resultsrealtimes = [1.049005, 1.059239, 1.026662, 1.066434, 1.050087]sample_size = 100full_data_size = 1000000average_time = avg(realtimes)# predicted runtime for full data sizeexpected_runtime = average_time / sample_size * full_data_sizep seconds_to_hms expected_runtime=> "02:55:02"
此代码将需要大约 3 个小时才能运行(!)
这是否可以接受将取决于您的用例,但现在您拥有做出决定所需的信息。
我希望这有帮助。 祝你在球场上好运!