有没有快速的方法在Ruby中生成比较基准图?

时间:2016-06-02 20:38:25

标签: ruby benchmarking performance-testing

我希望在Ruby中的两个矩阵乘法实现之间执行比较基准测试:第一个使用标准库Matrix类,另一个使用nmatrix-atlas gem(这是一个基于ATLAS的Ruby包装器)。

基准测试应该在一系列输入上执行,并且应该显示一个线图,其中X轴上的输入尺寸和Y轴上的时间。

我目前使用的代码如下所示:

require 'nmatrix'
require 'nmatrix/atlas'
require 'matrix'
require 'benchmark'
Benchmark.bm do |x|
  [5, 50, 500].each do |size|
    x.report("nm-atlas with size #{size}") do
      n = NMatrix.new([size,size], [1]*size*size, dtype: :float32)
      n.dot(n)
    end
  end

  [5, 50, 500].each do |size|
    x.report("ruby matrix with size #{size}") do
      n = Matrix[*[[1]*size]*size]
      n * n
    end
  end
end

这产生的输出对眼睛来说并不是非常友好(一旦输入和测试用例的数量增加,很快就会变得如此)。这是它的外观:

   user     system      total        real
nm-atlas with size 5  0.000000   0.000000   0.000000 (  0.000194)
nm-atlas with size 50  0.010000   0.000000   0.010000 (  0.000724)
nm-atlas with size 500  0.080000   0.000000   0.080000 (  0.084939)
ruby matrix with size 5  0.000000   0.000000   0.000000 (  0.000207)
ruby matrix with size 50  0.060000   0.000000   0.060000 (  0.055106)
ruby matrix with size 500 51.040000   0.000000  51.040000 ( 51.068719)

仅显示'真实'价值也没关系。有关比较基准的更好解决方案的任何想法吗?

1 个答案:

答案 0 :(得分:1)

我无法找到解决方案,所以我只是继续以benchmark-plot宝石的形式自己想出一个。

它基本上接受任何可枚举的对象,遍历其中的对象,并使用gruff在图表上绘制结果。要使用NMatrix与Ruby Matrix对矩阵乘法进行基准测试,可以使用以下代码:

require 'benchmark/plot'
require 'matrix'
require 'nmatrix'
require 'nmatrix/atlas'

sizes = [5, 10, 50, 100, 150, 200]

Benchmark.plot sizes, title: "Matrix multiplication",
  file_name: "matrix_multiplication" do |x|
  x.report "NMatrix with ATLAS" do |size|
    n = NMatrix.new([size,size], [1]*size*size, dtype: :float32)
    n.dot(n)
  end

  x.report "Matrix" do |size|
    n = Matrix[*[[1]*size]*size]
    n * n
  end
end

这将创建以下图表: NMatrix vs Ruby Matrix multiplication