Rubyで外部コマンドを実行する方法と処理時間の測定方法

はじめに

現在、大学の授業でプログラムの性能実験を行っています。 実験では、C言語で作成されたコードの性能比較を行うのですが、実行時間の測定などを行うのが大変です。 そこで、今回はRubyを利用して、C言語のコードを実行し、その実行時間を測定する方法を紹介したいと思います。

C言語のコードを実行するために

RubyC言語のコードを実行するために、外部コマンドを利用します。 外部コマンドとは、簡単にな例をあげれば、Linux上であれば、BashRubyのコードを動かした時、RubyのコードでBashで動かすことです。 外部コマンドが利用できれば、あとはいつも通りターミナル上でC言語のコードを動かす感覚で、C言語のプログラムを実行することできます。 Rubyには外部コマンドを動かす方法がいくつか存在するのですが、今回はバッククォート(`)を使った方法とopen3を使った方法を紹介します。

バッククォートを使った場合

バッククォートを使った場合の、外部コマンドの実行方法は以下の通りです。

`echo "Hello World`

バッククォートで囲った外部コマンドを実行できます。 標準出力しか、得ることができないのですが、Bashであれば、Bashの標準入力を使うことで標準入力を使うことができます。 簡単な実行結果であれば、バッククォートを使うのがいいでしょう。

open3を使った場合

open3を使った場合の、外部コマンドを実行するサンプルを以下に示します。 今回はpopen3で説明を行います。

require 'open3'

Open3.poepn3("echo Hello World") do |stdin, stdout, stderr, status|
  stdin.puts ""
  stdin.close
  stdout.each do |line|
    puts line
  end
  stderr.each do |line|
    puts line
  end
end

open3を使えば、標準出力だけでなく、標準入力、標準エラー、ステータスなども使うことができます。 Open3.popen3の("")内の外部コマンドが実行されます。

時間測定

Rubyには、Benchmarkという時間測定に便利なライブラリが存在します。 サンプルコードを示しておきます。

require 'benchmark'

result = Benchmark.realtime do
  # 測定したい処理
end

puts "#{result}"

Benchmark.realtimeを使うことで、do ~ end内の処理時間を測定することができます。 Benchmark.realtimeが実行時間を返却してくれるので、変数に格納してあげるとよいでしょう。 返却値は、秒数となっています。

まとめ

今回は自分が最近よく使う、open3とBenchmarkを紹介しました。 みなさんも機会があれば使ってみてはいかがでしょうか。