Koltlin을 통해서 백준을 준비하던중 하나 궁금한 점이 생겼습니다.
기본적으로 Kotlin을 통해서 사용할 수 있는 입출력 함수는 다음 세가지 입니다.
1. Scanner
2. BufferedReader
3. Java라이브러리를 확장한 Kotlin 자체 Console I/O
총 세가지 입니다. 자체적으로 입력을 받는다면 속도측정에 편차가 발생하는 것이 우려되어서 백준의 간단한 입출력 문제를 기준으로 속도측정 해봤습니다.
https://www.acmicpc.net/problem/1330
1330번: 두 수 비교하기
두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.
www.acmicpc.net
다음 문제를 풀기 위해서 총 세가지 형태로 입출력을 받는 코드를 작성해봤습니다.
1. Scanner
import java.util.*
fun main() = with(Scanner(System.`in`)){
val (n,m)= readLine()!!.split(" ").map { it.toInt() }
if(n>m) println(">")
else if(n<m) println("<")
else println("==")
}
2.BufferedReader
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
val (n,m)= readLine()!!.split(" ").map { it.toInt() }
if(n>m) println(">")
else if(n<m) println("<")
else println("==")
}
3. Kotlin Console I/O
fun main(){
val (n,m)= readLine()!!.split(" ").map { it.toInt() }
if(n>m) println(">")
else if(n<m) println("<")
else println("==")
}
해당 코드들을 각각 실행시켜봤습니다. 플랫폼 특성항 4~5ms의 편차는 발생할 수 있지만, 평균적인 속도는 다음과 같았습니다.
BufferdReader가 메모리와 시간순으로는 가장 효율적이었으며,
Kotlin Console은 시간면에서는 근소하게 느렸으며 메모리측면으로는 BufferdReader보다 효율적이지 못했습니다.
Scanner는 시간, 메모리 측면에서 모두 좋지 않은 성능을 보여주었습니다.
하지만, 개인적으로는 BufferedReader를 with 함수로 main함수 전체에서 쓸 수 있도록 해주었지만 다른 경우에는 객체를 선언하고 메모리 누수방지를 위해 객체 반환을 해주어야하므로 코드의 가독성 측면에서는 Kotlin Console I/O가 우수한 상황이 나올수도 있기 때문에 각자의 상황에 따라 적절하게 사용하는 것이 중요할 것입니다.