我希望在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)
仅显示'真实'价值也没关系。有关比较基准的更好解决方案的任何想法吗?
答案 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