간단한 데이터베이스 입출력, 루비, 그루비, 스칼라.

데이터

데이터베이스에 간단한 항목들을 넣고 빼는 코드를 만들어보았습니다. 과연 속도차이가 얼마나 날지 궁금했는데, 결과는 별로 차이가 없네요.

각각의 코드는 다음과 같습니다.

루비

require 'pg'

con = PGconn.connect("localhost", 5432, '', '', "testdb", "testdb", "")
res = con.exec('delete from wikititle')

i = 0
File.open("wikipedia.txt", "r") do |f|
    while(line = f.gets)
        line = line.strip
        puts "inserting [#{line}]"
        con.exec("insert into wikititle values(#{i}, '#{line}')")
        i += 1
    end
end

res = con.exec('select * from wikititle')
res.each do |row|
    puts "#{row["idx"]} : #{row["name"]}"
end

res = con.exec('select count(*) from wikititle')
puts res[0]
res = con.exec('delete from wikititle')

그루비는 루비와 비슷했구요.

그루비

mport groovy.sql.Sql

println "Starting.."

def sql = Sql.newInstance("jdbc:postgresql://localhost/testdb", "testdb", "", "org.postgresql.Driver")

disable_noisy_log(sql);

def i = 0;

new File('wikipedia.txt').eachLine { line ->
    println "inserting [${line}]"
    sql.execute("insert into wikititle values(${i}, '${line}')")
    i++;
}

sql.eachRow("select * from wikititle") {
    println "${i++} : name is ${it.name}"
}

res = sql.firstRow('select count(*) from wikititle')

println "count(*) : ${res[0]}"

res = sql.execute('delete from wikititle')

스칼라는 많이 다르네요.

스칼라

var connection:Connection = null

System.setProperty("file.encoding", "UTF-8")

try {
    Class.forName( "org.postgresql.Driver")
    connection = DriverManager.getConnection("jdbc:postgresql://localhost/testdb", "testdb","")
    val stmt = connection.createStatement()

    var i = 0;

    for (line &lt- Source.fromFile("wikipedia.txt")("UTF-8").getLines()) {
        println(s"inserting [${line}]")
        stmt.execute(s"insert into wikititle values(${i}, '${line}')")
        i+=1;
    }

    val resultSet = stmt.executeQuery("SELECT * FROM wikititle")

    while ( resultSet.next() ) {
        val name = resultSet.getString("name")
        val id = resultSet.getString("idx")
        println("name, id = " + name + ", " + id)
    }

    val res = stmt.executeQuery("SELECT count(*) FROM wikititle")

    while ( res.next() ) {
        val count = res.getInt(1)
        println (s"count(*) : ${count}")
    }

    stmt.execute("delete from wikititle")

} catch {
    case e :Throwable =&gt e.printStackTrace
}

connection.close()

코드는 깃허브에 올려두었습니다. https://github.com/jinto/bench 에서 clone 받으셔서 실행해보실수 있습니다.

=== 추가 ===

레코드를 늘려서 해보면, 그루비가 20%정도 느리군요. ㅜㅜ (그루비에서도 JDBC를 쓰면 속도가 비슷하게 나올듯. groovy.sql 이 편한대신 약간 느린가봅니다) 루비랑 스칼라가 거의 비슷한 속도를 내는 것도 좀 이상하구요.

저는 맥북프로에서 ruby1.9.3p194, groovy 2.1.1, scala 2.10.0 으로 테스트했습니다.

=== 추가 ===

파이썬 코드를 깃허브에 추가했습니다.

제 맥에서는 파이썬이 1등이네요.

  • python : 39 seconds
  • scala : 76 seconds
  • ruby : 77 seconds
  • groovy : 96 seconds

입니다.