Swifter {Swift Developer}

메뉴

println은 NSLog의 10배정도 빠르다

Swift에서는 왜 NSLog이외에 println이 추가되었을까?

기본적으로 println을 사용해야 하는 분위기라고 생각하지만, 실제로 사용하면 효과가 있을지 의문이 생겨서 테스트해보았습니다.

첫번째 제네릭으로 정의되어 있어 문자열이외에는 신경쓰지 않아도 된다는게 좋습니다.

[swift]

func println<T>(object: T)

[/swift]

[swift]

FOUNDATION_EXPORT void NSLog(NSString *format, …) NS_FORMAT_FUNCTION(1,2);

[swift]

이제 느린것으로 유명했던 NSLog이었지만, 이를 해결해본다는 생각으로 테스트해보았습니다. (이 테스트 결과는 Xcode6 베타6로 처리한 결과입니다)

10000번 루프 실행

[swift]

let now = NSDate().timeIntervalSince1970
for i in 0…10000 {
println(“mj”) // NSLog(“mj”)에서도 시도
}
let elapsed = NSDate().timeIntervalSince1970 – now
println(“elapsed: (elapsed)”)

[/swift]

시뮬레이터에서 테스트했으면 아래와 같이 결과는 10배정도 빨랐습니다.

  • println : 0.2초 전후
  • NSLog: 2.3초 전후

혹시나 해서 Objective-C에서도 사용할 수 있도록 구현한 것입니다.

[objc]

@objc
class Util {
class func NSLog(message: String) { // 제네릭 사용하면 Objective-C에서 보이지 않음
println(message)
}
}

[/objc

[objc]

+(void)loopPrint {
NSTimeInterval now = [NSDate date].timeIntervalSince1970;
for (NSUInteger i = 0; i < 10000; i++) {
[Util NSLog:@”mj”];
}
NSTimeInterval elapsed = [NSDate date].timeIntervalSince1970 – now;
[Util NSLog:[NSString stringWithFormat:@”elapsed: %f”, elapsed]];
}

[/objc]

Objective-C에서 Swift코드를 추가해서 실행해도 10배 빠른 비슷한 결과가 나왔습니다. 이렇게 테스트해본 후에 알게 된 것은 그냥 빨리처리하고 싶다면 아래와 같이 정의해도 괜찮았습니다.

[objc]

+(void)NSLog2:(NSString*)message {
printf(“%sn”, [message UTF8String]);
}
// 또는
#define NSLog2(message) printf(“%sn”, [(message) UTF8String])

[/objc]

이렇게 구현하면 Objective-C에서 println을 사용하지 않아도 좋은 성능을 보였습니다. 즉 결론적으로는 println이 잘 되어 있다는 것입니다.

Facebook Comments

카테고리:   Swift

댓글

죄송하지만 댓글은 닫혀 있습니다.