-
CFAbsolute TimeGetCurrentSwift 2021. 1. 15. 09:48
안녕하세요 그린입니다!
이번 포스팅에서는 프로세스의 시스템 시간 (절대 시간)을 구하는 메서드인 CFAbsolute TimeGetCurrent에 대해 알아보겠습니다.
우선 해당 메서드를 가장 많이 사용할때는 원하는 프로세스의 시작과 끝의 시간을 재기 위해 저는 사용했습니다.
그럼 CFAbsolute TimeGetCurrent이 무엇인지 애플 공식 문서를 보면서 일단 알아가시죠!
-. CFAbsolute TimeGetCurrent
이렇게 애플 공식문서를 보면 시스템의 절대 시간을 반환하는 메서드라고 설명이 나와있습니다.
이러한 시간을 얻기위한 TimeUtility는 많은것이 있는데 그건 밑에서 알아보겠습니다!!
아래와 같이 직접 메서드를 구현하며 시간을 담을 변수를 선언하고 절대 시간을 담는 방법으로 사용합니다.
private func calculateTotalTime(bankTaskFunction: () -> ()) { let startTime = CFAbsoluteTimeGetCurrent() bankTaskFunction() let totalTime = CFAbsoluteTimeGetCurrent() - startTime print(totalTime) }
이런식으로 startTime은 현재 해당 메서드가 동작할때의 절대시간을 나타내며 totalTime은 bankTaskFuntion이라는 클로저 인자를 받아 실행이 끝난 후 현재 절대시간에서 처음 시작한 startTime을 빼주게 되면 경과한 절대시간 값이 나오게 됩니다.
그렇다면, 해당 코드에서 bankTastFuntion()이라는 클로저를 실행하기 위해 프로세스를 어떻게 처리하는지 보겠습니다.
우선 위와 같이 파라미터에 클로저로 선언을 해줍니다.
그 후 아래와 같이 calculateTime(시간 계산)을 계산해주고 싶은 프로세스 흐름에 넣어줍니다.
calculateTotalTime { while !customers.isEmpty { for windowNumber in 0..<bankers.count { checkBankerIsWorking(windowNumber) } } checkEnd() }
이렇게 된다면 해당 반복문이 시작되어 끝나고 checkEnd() 메서드가 호출되어 끝나게 되는 시점까지의 절대시간을
calculateTotalTime에서 계산을 하고 해당 메서드 안에서 시간을 출력해줬으니 출력하게 됩니다.
즉, calculateTotalTime의 파라미터로 받은 bankTaskFuntion이 바로 위 반복문과 checkEnd()가 들어있는 클로저가 되는것입니다.
다만, 주의할점은 클로저가 끝나게 되면 calculateTotalTime안에서 선언된 startTime과 totalTime의 시간 변수의 값은 사용할 수 없게됩니다. 이 부분을 유의하여 어디서 시간을 담을것인지 고민해보면 좋을것 같습니다.
-. TimeUtilites
: 현재 Swift에서 시간 유틸리티를 지원하는 다양한 기존 함수들은 Deprecated되었고 위에서 설명한 CFAbsolute TimeGetCurrent
하나만 남아있는걸 볼 수 있습니다.
기존에는 절대시간을 계산하여 그레고리안 단위 표시 / 요일 / 연중일 표시 등 다양한 함수들이 있었지만
현재는 date() 함수와 dateFormat등 다양하게 사용이 가능하기에 Deprecated 된것 같습니다.
남아있는 Time utilities를 보면 우리가 위에서 설명한 해당 함수만 남아있습니다.
그런데 이 메서드는 CFAbsoluteTime을 반환합니다.
-. CFAbsoluteTime
: 절대시간을 뜻하며, 2001년 1월 1일 0시 0분 기준으로 특정 시점을 나타날때 사용되는 유형이라 나와있습니다.
그렇다면 2001년 1월 1일 0시 0분 기점으로 이전 절대시간은 음수로 표현되고 이후 절대시간은 양수로 표현된다고 합니다.
그럼 테스트를 한가지 해보겠습니다. 위의 예시에서 돈 프로세스 분기를 실행하였을때 걸린시간이 아닌 startTime을 출력해보겠습니다.
632363867.341246
이라는 결과값이 나옵니다.
해당 결과값(초)를 연단위로 환산했을때 20년이 흐르고 15일이 지난 값으로 환산되니 현재 2021년 1월 15일의 시간과 동일합니다.
즉, 정말 해당 기점으로 시스템의 흐른 절대 시간을 단지 초로 나타내줍니다.
음..... 왜 절대시간을 구하는 여러 함수들이 Deprecated 되었는지 알것도 같습니다..
그런데 또 자세히보면 해당 시간은 CFTimeInteval 타입입니다.
-. CFTimeInterval
: 절대 경과시간을 초로 나타내기 위해 Double 형으로 선언된 타입 별칭입니다.
이렇게 CFAbsoluteTime이 CFTimeInterval을 타입 별칭으로 지정하여 사용하고 또, CFTimeInterval은 Double 타입별칭으로 사용합니다.
마지막으로 드는 의문점이 그럼 왜 CFAbsoluteTIme에서 직접 Double형을 타입 별칭으로 사용하면 될것 같은데 왜 한단계를 더
거친것인가... 하는 의문이 듭니다.. 의문은 미궁속으로..
오늘은 간단하게? 절대시간을 구하는 함수와 프로세스 시간을 구하기 위해 적용하는 방법까지 배워봤습니다.
다소 난해하다고 생각할 수도 있지만 파고 파고 개발문서를 보다보면 실마리가 풀리는 느낌이 들었습니다.
항상 느끼는점은 애플 공식문서를 보며 이해가 되지 않더라도 붙잡고 씨름하다보면 값진 경험을 할때가 많습니다!!
감사합니다!! :D
'Swift' 카테고리의 다른 글
타입 메서드 (0) 2021.01.27 온도 표현단위와 변환 방법 (0) 2021.01.19 메모리 구조 & ARC (0) 2021.01.11 Concurrent Programming (0) 2021.01.07 인스턴스 생성 및 소멸 (0) 2020.12.28