2017-12-12 30 views
0

, 나는이 같은 시간에 표현을 한 변환을 작성하는 많은 청소기로 찾기 : 그러나불필요한 큰 변수를 제거하는 swiftc 컴파일러 최적화가 있습니까? 내가 고차 기능을 가진 코드를 쓰고 있어요 때

let children = objects.map { $0.children } 
let validChildren = children.filter { $0.isValid } 
let sortedChildren = validChildren.sorted { $0.count < $1.count } 

, 내가 알고있는 이들 각각 그 함수는 변수에 저장하는 새로운 Array 객체를 반환하므로 이론적으로 매번 새로운 Array를 만들고 유지하면서 많은 메모리를 낭비합니다. 사용 후에 불필요한 배열이 파괴되도록 호출을 한 줄로 작성하는 것이 좋습니다.

let sortedChildren = objects.map { $0.children } .filter { $0.isValid } .sorted { $0.count < $1.count } 

하지만 한 줄의 코드에서 너무 많은 일이 일어나기 때문에 나중에 읽는 것이 더 짜증납니다. 그래서 내 질문은 : 스위프트의 컴파일러가 내 nit-pickiness를 용서하고 컴파일 타임에 사용되지 않는 변수를 제거하는 최적화를 가지고 있습니까?

+0

* "한 줄의 코드에 너무 많은 것이 있습니다"* -'.filter'와'.sorted' 전에 ​​줄 바꿈을 할 수 있습니다 ... –

+1

이것은 조기 최적화와 같은 냄새가납니다. – rmaddy

+1

아니요 컴파일러는 다른 변수로 나누는 것에 신경 쓰지 않습니다. 그러나 메모리에 대해 걱정한다면 @MartinR이 말했듯이 줄 바꿈을 사용하거나 최소한 변수를 private/fileprivate 또는 lazy로 선언 할 수 있습니다. – Vollan

답변

1

이것은 @MartinR에 의해 질문에 언급되었지만 공식적인 답변과 출처가 있어야합니다.

스위프트 모든 표준 라이브러리 용기

As per the Swift repository docs:

는 COW (복사 (copy-on-write)) [4] 대신에 명시 사본 카피를 수행하기위한 값을 사용하는 형식이다. 많은 경우이 방법을 사용하면 컴파일러에서 전체 복사본을 수행하는 대신 컨테이너를 유지하는 에 의해 불필요한 복사본을 제거 할 수 있습니다. 컨테이너의 참조 카운트 이 1보다 크고 컨테이너가 변경되면 기본 컨테이너 만 복사하여 수행하는 입니다. 다음으로 예를 들어, 복사 동작은 D가 C에 할당 될 때 발생하지 않지만 D 2를 추가하여 구성 돌연변이를 겪는 경우, D는 가 복사 될 다음 2 (D)에 추가 될 것이다

var c: [Int] = [ ... ] 
var d = c  // No copy will occur here. 
d.append(2)  // A copy *does* occur here. 

고차 함수는 호출되는 객체를 수정하지 않으므로 결과가 크기에 최적화되어 있다고 높은 확신을 가지고 말 할 수 있습니다.

1

두 버전간에 차이는 없습니다.

결과를 변수에 할당하지 않더라도 함수 호출 결과를 저장하기 위해 목록의 새 인스턴스 하나가 만들어집니다. 따라서 메모리 사용량은 동일합니다.

objects.map { $0.children }.filter { $0.isValid }.sorted { $0.count < $1.count } 

그래서 각 함수 호출 후, 우리는 여전히 상관없이 그 함수의 결과를 저장하지 않으려면 메모리를 필요로하면 assign 그 변수에 아닌지. 다른 변수에 assigning은 개체의 복사본을 만들지 않습니다.