Follow me on GitHub

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

2013-04-26 10:49:30 +0000

데이터

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

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

루비

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

입니다. <div id=comments> </div>


|