以下に、範囲で定義されたさまざまな長さの配列の組み合わせのセットを生成する関数があります。組み合わせを処理するのに必要な時間を含む、組み合わせプロセスに関するデータを取得できるようにしたいと考えています。以下を考えると:
source = ("a".."z").to_a
range = 1..7
組み合わせを生成するコマンドは次のとおりです。
combinations = (range).flat_map do |size|
source.combination(size).to_a
end
このコマンドは私のマシンで実行するのに約 5 秒かかり、971,711 の組み合わせが生成されます。ただし、関数のコンテキストでこれを実行しようとすると、以下のようになります。
def combinations(source, range)
time_start = Time.now
combinations = (range).flat_map do |size|
source.combination(size).to_a
end
time_elapsed = (Time.now - time_start).round(1)
puts "Generated #{combinations.count} in #{time_elapsed} seconds."
return combinations
end
source = ("a".."z").to_a
range = 1..7
combinations(source, range)
この関数は、ほぼ即座に次を出力します。
Generated 971711 in 0.1 seconds.
...そして5秒後に組み合わせを返します。何が起きてる?そして、組み合わせを処理するのに必要な時間をどのように計算できますか?