2014-09-27 6 views
7

놀이터의 실행 속도를 높이는 방법이 있습니까? 많은 사이클을 반복하고 10 분을 기다리지 않으려합니다. 예를 들어스위프트 놀이터 실행 속도

:이 코드는 방법은 너무 오래 실행됩니다

import UIKit 

var count = 0 
for var i = 0; i < 1000000000; i++ { 
    count++ 
} 

. 하지만 빠른 결과를 원합니다.

+0

아마도 최적화 컴파일러는 해당 코드를 'var count = 1000000000'으로 줄입니다. – zaph

+0

@Zaph이 코드를 놀이터에 붙여 넣으면 내 뜻을 알 수 있습니다. – zakhej

+1

왜 사람들이 투표 마감을 결정합니까? 놀이터가 뭔지 아니? – zakhej

답변

3

나는 두번째 기능을 [Double]으로 인쇄하고 나서 UIImageView으로 변환하여 놀고있었습니다. 하나의 단계는 수백만 픽셀을 반복하는 것이었고 영원히 필요했습니다.

계산적으로 집중적이거나 반복적이거나 시간이 오래 걸리는 것은 놀이터의 "Sources"폴더에 저장해야합니다. 그렇게하면 코드가 미리 컴파일되어 놀이터가 실행됩니다. 해당 for 루프의 출력을 놀이터에서 호출 할 수있는 공용 함수에 넣으십시오. 그렇다면 놀이터 카운트를 보면서 거기에 앉아있을 필요가 없습니다. 항상 루프를 통과합니다. for.

0

나는 그런 문제가 있었고 나는 시련의 날들 후에 그것을 해결했다. 내가 할 일은 놀이터의 폴더 Sources에있는 모든 코드를 이동하는 것뿐입니다. 그래서 실행 속도가 향상되었습니다. 도움이 되었기를 바랍니다.

참고 : 공개 수업을 사용하는 것을 잊지 마십시오.

2

가장 큰 성능 저하 요인 중 하나는 놀이터의 오른쪽에 출력됩니다. 이제이 출력을 최소화하는 방법을 보여 드리겠습니다.

예제 코드는 끝 부분을 참조하십시오.


최상의 성능

가장 성능이 좋은 방법은 놀이터에서 Sources 폴더 안에 .swift 파일의 모든 성능이 중요한 코드를 확인하는 것입니다.

참고 :Sources 폴더의 함수, 클래스, 속성 및 메서드를 사용하려면 public을 표시해야합니다. 클래스를 하위 클래스로 만들려면 open이라고 표시해야합니다.


좋은 성능하지만 다음 방법은 (내가이 공식/아니다라고 생각합니다) 또한 놀이터 출력을 비활성화하는 데 사용 할 수 있지만 추한 코드

추한 코드에 연결됩니다. 그러나 출력을 일시적으로 사용 불가능하게하는 것이 좋습니다.

(당신이 우리가을 알려 더 좋은 방법을 찾을 경우 ) 출력의 최소 금액을 달성하기 위해 두 가지 방법 (두 개의 트릭)가 있습니다

  1. 사용 괄호 Void (또는 Void?) 주변 배정과 같은 표현 (보통 출력이 없으며, 3.도 참조).

    var x = 0  // output: 0 
    (x = 1)   // NO output 
    (x = 2 * x - 1) // NO output 
    (x.negate()) // NO output 
    

    참고 : 스위프트에서 과제는 Void 반환하고 optional chaining의 경우는 Void?입니다.

    var x: (Int, Int)? = nil 
    if (x?.0 = 0) != nil { 
        // assignment was successful (x!=0 and now x=(0, x.1)) 
    } else { 
        // assignment was not successful (x==nil) 
    } 
    
  2. 변수를 별도로 초기화하고 선언하십시오.

    var x: Int // NO output 
    (x = 0) // NO output 
    
  3. 1. 위 또는 () 아래에 추가로 어떤 조합 (아무런 조작) 줄을 추가하지 작동하지 않는 경우.

    이 예를 들어 하나의 라인 폐쇄에 발생 (아마 다른 상황과) :

    [1, 4, 5, 6].mmap{ 
        () // without this line the line below would yield to an output 
        ($1 = $0 + 1) 
    } as [Int] 
    
  4. 대신 괄호 안에 모든 라인 포장의 (아래도 코드를 참조) 또한의 튜플을 사용할 수 있습니다 다음 변수에 할당 된 모든 표현 : 그러나

    var a: Any // this may be a useful definition in this context 
    var x: Int 
    var y: Int 
    (a = (x = 0, 
         y = 1, 
         x = y + 1, 
         y = x*x)) 
    

    이것은 들여 쓰기 재해로 이어질 수 ...

작동하지 않는 곳 (출력을 제거하는 방법을 찾지 못했습니다. 이 목록은 아마) 완료되지 않습니다

  1. return 기능의 s와 클로저를 이 Optional 변수의
  2. 선언 예
  3. : var x: Int?

Sequence

에 대한 새로운 map 방법의 예

사용법 : 위의 3 번 지점을 참조하십시오.

,451,515,

Sequence.map의 서명은

내가 어떻게 하나 (과제와 "반환"값을 얻을)을 inout 인수 클로저를 사용할 수 return의의 출력을 제거하는 방법을 발견하지 않았으므로
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T] 

. 가능한 서명은 다음과 같을 수

func mmap<U>(_ transform: (Element, inout U?) ->()) -> [U] 

그래서 우리가 inout 인수에 nil을 통과 할 수는 인스턴스 생성을 필요로 할 수 U에 제약을 부과하지 않고 가능한 모든 U을위한 좋은 기본이기 때문에 (예 : init() { ... }를) .

불행히도 Swfit은 U을 추론 할 수 없으므로 명시 적 유형 주석으로 컴파일러를 도와야합니다. 또한 var newElement: U?이고 사이드 바에는 nil이 반환됩니다.

지금은 Any 대신 U? 사용합니다 :

extension Sequence { 
    // ATTENTION: this is not as performant as the normal `map`! 
    func mmap<U>(transform: (Element, inout Any) ->()) -> [U] { 
     var result: [U] 
     (result = [U]()) 
     for element in self { 
      var newElement: Any 
      (newElement = 0) // some placeholder element 
      (transform(element, &newElement)) 
      // assume the inout element to be of type `U` 
      (result.append(newElement as! U)) 
     } 
     return result // the ONLY output in this method 
    } 
} 

귀하의 예제 코드

스위프트 4

var count = 0 
for i in 0..<1_000_000_000 { 
    (count += 1) 
    if count % 100_000 == 0 { 
     // print only every 100_000th loop iteration 
     print(count) 
    } 
} 

를 사용하여 괄호없이 : 초당 약 10.000 루프 반복을

괄호 포함 : 초당 약 10.000 루프 반복!