또한 "간단한"코드를 입력하는 동안 100 % 이상의 CPU를 경험했습니다. 코드를 구조화하는 방식으로 신속 파서를 더 빠르게 만드는 몇 가지 작은 트릭.
문자열에서 "+"연결자를 사용하지 마십시오. 나에게 이것은 매우 빠르게 느려짐을 유발합니다. 각각의 새로운 "+"는 파서를 크롤링하고 함수 본문의 어딘가에 새 문자를 추가 할 때마다 코드를 다시 구문 분석해야합니다.
대신에:
var str = "This" + String(myArray.count) + " is " + String(someVar)
신속하게 구문 분석하는 데 훨씬 더 효율적인 템플릿 구문을 사용하십시오.
var str = "This \(myArray.count) is \(someVar)"
이렇게하면 기본적으로 인라인 vars "\ (*)"로 strlen에 제한이 없음을 알 수 있습니다.
+ / *-를 사용하는 계산이 있으면 더 작은 부분으로 나눕니다.
대신에:
var result = pi * 2 * radius
사용하다:
var result = pi * 2
result *= radius
덜 효율적으로 보일 수 있지만 빠른 파서는이 방식으로 훨씬 빠릅니다. 일부 수식은 수학적으로 정확하더라도 많은 연산이 필요하면 컴파일되지 않습니다.
복잡한 계산이 있으면 func에 넣으십시오. 이렇게하면 파서가 한 번 파싱 할 수 있으며 함수 본문에서 무언가를 변경할 때마다 다시 파싱 할 필요가 없습니다.
함수 본문에 계산이 있으면 유형, 구문 등이 여전히 올바른지 여부를 매번 빠른 파서가 확인하기 때문입니다. 선이 계산 위로 변경되면 계산 / 공식 내의 일부 변수가 변경되었을 수 있습니다. 외부 기능에 넣으면 한 번 유효성이 검사되고 정확하고 지속적으로 재분석하지 않아 CPU 사용량이 높아집니다.
이렇게하면 입력하는 동안 각 키를 누를 때마다 100 %에서 CPU가 낮아졌습니다. 예를 들어 함수 본문에 인라인으로 배치 된이 3 줄은 swiftparser를 크롤링 할 수 있습니다.
let fullPath = "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData = NSDictionary(contentsOfFile: fullPath )! // as Dictionary<String, AnyObject>
let spaces : AnyObject = spacesData["SpacesDisplayConfiguration"]!["Management Data"]!!["Monitors"]!![0]["Spaces"]!!
println ( spaces )
하지만 내가 그것을 func에 넣고 나중에 호출하면 swiftparser가 훨씬 빠릅니다.
// some crazy typecasting here to silence the parser
// Autodetect of Type from Plist is very rudimentary,
// so you have to teach swift your types
// i hope this will get improved in swift in future
// would be much easier if one had a xpath filter with
// spacesData.getxpath( "SpacesDisplayConfiguration/Management Data/Monitors/0/Spaces" ) as Array<*>
// and xcode could detect type from the plist automatically
// maybe somebody can show me a more efficient way to do it
// again to make it nice for the swift parser, many vars and small statements
func getSpacesDataFromPlist() -> Array<Dictionary<String, AnyObject>> {
let fullPath = "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData = NSDictionary(contentsOfFile: fullPath )! as Dictionary<String, AnyObject>
let sdconfig = spacesData["SpacesDisplayConfiguration"] as Dictionary<String, AnyObject>
let mandata = sdconfig["Management Data"] as Dictionary<String, AnyObject>
let monitors = mandata["Monitors"] as Array<Dictionary<String, AnyObject>>
let monitor = monitors[0] as Dictionary<String, AnyObject>
let spaces = monitor["Spaces"] as Array<Dictionary<String, AnyObject>>
return spaces
}
func awakeFromNib() {
....
... typing here ...
let spaces = self.getSpacesDataFromPlist()
println( spaces)
}
Swift와 XCode 6.1은 여전히 버그가 많지만 이러한 간단한 트릭을 따르면 코드 편집이 다시 허용됩니다. .h 파일을 제거하고 훨씬 더 깔끔한 구문을 사용하기 때문에 빠른 속도를 선호합니다. "myVar as AnyObject"와 같이 여전히 많은 타입 캐스팅이 필요하지만 복잡한 목표 -c 프로젝트 구조 및 구문에 비해 더 작은 악입니다.
또한 또 다른 경험으로 SpriteKit을 사용해 보았습니다. 사용하기는 재미 있지만 60fps에서 지속적으로 다시 칠할 필요가 없으면 매우 비효율적입니다. "스프라이트"가 자주 변경되지 않는 경우 이전 CALayers를 사용하는 것이 CPU에 훨씬 좋습니다. 레이어의 .contents를 변경하지 않으면 CPU가 기본적으로 유휴 상태이지만 백그라운드에서 실행중인 SpriteKit 앱이있는 경우 제한적인 60fps 업데이트 루프로 인해 다른 앱의 비디오 재생이 끊길 수 있습니다.
컴파일하는 동안 xcode가 이상한 오류를 표시하는 경우 "Product> Clean"메뉴로 이동하여 다시 컴파일하는 데 도움이됩니다. 캐시의 버그가있는 구현 인 것 같습니다.
xcode가 코드에 갇혀있을 때 구문 분석을 개선하는 또 다른 좋은 방법은 여기에 있는 다른 stackoverflow 게시물에 언급되어 있습니다 . 기본적으로 .swift 파일의 모든 내용을 외부 편집기로 복사 한 다음 기능별로 다시 복사하여 병목 지점을 확인합니다. 이것은 실제로 내 프로젝트가 100 % CPU에 미친 후 xcode를 다시 합리적인 속도로 얻는 데 도움이되었습니다. 코드를 다시 복사하는 동안 코드를 리팩터링하고 함수 본문을 짧게 유지하고 함수 / 공식 / 표현식을 단순하게 (또는 여러 줄로 분할) 시도 할 수 있습니다.