CPU 바운드

CPU만 완료하면 되는 작업을 중심으로 구현 되는 알고리즘. 알고리즘의 성능은 실행중인 CPU의 성능에

좌우되며 CPU만 업그레이드해도 성능이 향상된다.

fun isPalindrome(word: String): Boolean {
		val lcWord = word.toLowerCase()
		return lcWord == lcWord.reversed()
}

위 코드는 회문을 판별하는 코드이다. 단어 목록을 가져와서 filterPalindromes() 함수 안에 isPalindrome()함수를 호출한다고 생각해보자.

fun filterPalindromes(words: List<String>): List<String> {
    return words.filter { isPalindrome(it) }
}

마지막으로 단어 목록이 저장되어있는 리스트에 filterPalindromes()를 호출한다.

val words = listOf("level", "pope", "needle", "Anna", "Pete", "noon", "stats")

fun main(args: Array<String>) {
    filterPalindromes(words).forEach {
				println(it)
		}
}

위 코드들은 실행의 모든 부분이 CPU 성능에 의존적이다. 수십 만 개의 단어를 보내도록 코드를 바꾸면

filterPalindromes()함수는 더 오래 걸릴 것이다. 코드를 더 빠른 CPU에서 실행하면 코드의 변경 없이

도 성능이 향상된다.

I/O 바운드

I/O 바운드는 입출력 장치에 의존하는 알고리즘이다. 실행 시간은 입출력 장치의 속도에 따라 달라지는데

위 코드의 filterPalindromes() 각 단어를 전달해 좌우가 같은 단어를 출력하는 알고리즘이 I/O 바운드다.

이전 코드에서 몇 줄을 변경하면 다음과 같은 효과를 얻을 수 있다.

fun main(args: Array<String>) {
		val words = readWordsFromJson("resource/words.json")
		filterPalindromes(words).forEach {
				println(it)
		}
}

readWordsFromJson() 함수는 파일 시스템에서 파일을 읽는다. 파일을 읽는 속도에 따라 성능이 달라지는 I/O 작업이다. 파일을 하드 디스크에 저장하면 SSD에 저장하는 경우보다 성능이 더 나빠진다.

(하드 디스크는 플레터라는 원판에 저장된 자료를 회전 시켜서 읽고, 다시 저장하는 방식이라 회전률에 따라서 저장된 자료를 빨리 찾고 빨리 저장된다. 하지만 SSD는 회전이 필요없이 읽고 저장.)