2014-07-25 3 views
2

저는 스위프트의 속도 문제로 주로 배열을 사용하여 싸우고있었습니다. 현재 최신 '베타 4'출시. 문제를 시도하고 보여주기 위해 코드를 놀이터로 분해했습니다.스위프트 (베타 4)의 2D 어레이 반복 속도

2D 배열을 설정하고, 반복하고, 각 요소를 설정합니다.

import UIKit 

func getCurrentMillitime() -> NSTimeInterval { 
    let date: NSDate = NSDate() 
    return date.timeIntervalSince1970*1000; 
} 

let startTime = getCurrentMillitime() 

let X = 40 
let Y = 50 
var distanceGrid = [[CGFloat]](count: X, repeatedValue:[CGFloat](count: Y,repeatedValue:CGFloat(0.0))) 
for xi in 0..<X { 
    for yi in 0..<Y { 
     distanceGrid[xi][yi] = 1.1 
     //println("x:\(xi) y:\(yi) d:\(distanceGrid[xi][yi])") 
    } 
} 

let endTime = getCurrentMillitime() 
let computationTime = endTime - startTime 
println("Time to compute \(computationTime) ms") 

은 위의 코드를 실행하고 당신은 얻을 것이다 :
Time to compute 2370.203125 ms 

확실히 어떤 잘 될 수 없습니다 .. 나는 numpty 건가요!?

+0

'numpty'라는 단어를 사용하려면 +1하십시오 (하지만 반드시 그렇지는 않습니다)! – GoZoner

+0

그 이상한 ... _beta4_ 상당히 빠른 런타임 있어요 : _ "72.72509765625 ms 계산할 시간"_. 그 코드는 내 컴퓨터에서 약 30 배 더 빠르게 보입니다 ... – holex

답변

0

스위프트 베타가 배열에 어려움을 겪고있는 것은 분명합니다. 객관적 - c와 비교할 때 1 차원 배열이더라도 그 차이는 엄청납니다.

저는 objC 클래스를 신속한 프로그램에 혼합했으며 두 언어 모두 1,000,000 개의 요소 배열을 만들고 변경했습니다. 이것이 내가 맥북에서 얻은 것입니다 :

스위프트 방식으로 경과 된 시간 : 2.7078 초 objective-c 방법에 의한 경과 시간 : 0.033,815초

코드 (VAR의 nrOfElements = 1000000)

// Swift 
    let startTime = NSDate(); 
    var stringList = Array<String>(count: nrOfElements, repeatedValue:String()) 
    for i in 0..<nrOfElements { 
     stringList[i] = "Some string"; 
    } 
    let endTime = NSDate(); 
    println("Elapsed time by Swift method: " + 
     NSString(format:"%.4f", endTime.timeIntervalSinceDate(startTime)) + " sec"); 

    // Objective-c 
     NSDate *startTime = [NSDate date]; 
     NSMutableArray *stringList = [NSMutableArray arrayWithCapacity:10]; 
     for (int i = 0; i < nrOfElements; i++) { 
     [stringList addObject:@"Some string"]; 
     } 
     NSDate *endTime = [NSDate date]; 
     printf("%s\n", [[NSString stringWithFormat:@"Elapsed time by objective-c method: %f seconds", [endTime timeIntervalSinceDate:startTime]] UTF8String]); 
  • 그래서 배열 처리는 우선 순위리스트에 높지 향상 베타 3 및 베타 (4) 사이에 차이를 발견 .
  • 점점 커지는 어레이를 처리하면 처리 시간이 비례합니다. 스위프트의 배열의
  • 사전 제작은 'APPEND'

하자 희망보다 실제로 더 빠른 더 높은 차원의 요소의 수를 증가 할 때 다차원 배열을 처리

  • 훨씬 더 비용이 많이 드는 일이 적절 것이다 최종 버전에서 수리해야한다.

  • +0

    내 발견을 거의 명확히 밝혀 줘서 고마워요. 언어 베타 뒤에 베타 또는 아닙니다, 나는 왜 4yrs 정도 후에 배열이 여전히 면화로 싸여 있는지 알아 내려고 애 쓰고 있습니다! – guyvert1

    +0

    귀하의 벤치 마크가 베타 5에서 더 이상 정확하지 않은 것으로 보입니다. 위의 신속하고 객관적인 C 코드를 실행하면 Swift에 대해 0.050875 초, -O를 사용하여 Objective-C에 0.040739 초가 주어집니다. 릴리스 빌드에 사용됨) 및 Objective-C에 대한 -Os (2012 i7 Retina MBP에서) 이 테스트를 다시 실행할 수도 있습니다. –

    2

    두 가지 스위프트 성능에 대한 고려 :

    • 그것은 매우 공기에 베타 중입니다.

    • 많은 스위프트의 성능 트릭은 최적화 프로그램에 따라 다릅니다. 특히 제네릭이 포함 된 경우 (모든 배열은 일반 Array<T>) Swift는 -O0에서보다 표현적이고/디버거 친화적 인 구현을 사용하지만보다 고성능 구현 인 -O 또는 -Ofast으로 최적화합니다. (-Ofast도 경계 검사 및 기타 안전 기능을 빼앗아 있습니다, 그래서 생산 빌드에 대한 좋은 생각이 아니다.)

    을 또한, 현재 예 init(count:repeatedValue:와 2 차원 배열을 만들 수있는 시간을 모두 측정되어주의 그리고 그것을 반복하는 시간. 후자 만 측정하려는 경우 배열을 만든 후에 startTime을 설정해야합니다.

    +0

    다른 사람들이 비슷한 것을보고 있는지 궁금해하는 '베타'상태를 완전히 이해합니다. – guyvert1

    0

    "아래 첨자"아래의 언어 가이드에서 2D 배열의 2D (구조체) 구현을 찾을 수 있습니다. 그러나 1000 개 요소 이상으로 이동하면 값을 지정하는 것이 다소 느립니다.

    로컬 2D 배열을 만들고 쉽게 액세스 할 수 있도록 구조체에 설정하는 것이 훨씬 빠릅니다.

    배열에 값을 추가하는 것보다 값이 반복되는 배열을 만들고 덮어 쓰는 것이 더 빠릅니다.

    약 100k 값의 경우 구조체에 대해 ~ 9 초, 추가시 1.5 초, 반복되는 값을 덮어 쓰는 0.6 초가 필요합니다.

    저는 구조체 아이디어와 비슷하지만 너무 느립니다. 확실히 베타 버전의 문제입니다.

    0

    베타 버전조차도 70 년대 하드웨어에서 80 년대 소프트웨어처럼 작동하지 않는다는 것에 동의합니다. 그래서 스위프트 배열 처리 기능을 좀 더 파고 들었고 놀라운 결과를 얻었습니다. 우리는 이미 C + +, C#, Java 등의 다른 언어와 비교했을 때 Swift 배열 성능이 좋지 않음을 배웠습니다.

    이전 테스트에서 필자는 로컬 스코프 배열을 작성하고 채우는 데 걸리는 시간을 측정했습니다 백만 가지 요소. 우리가 보았 듯이 objective-c는 약 80 배 빠릅니다. 전역 클래스 범위에서 선언 된 배열을 비교할 때 더 나빠집니다. 그러면 objC가 약 500 배 빨라졌습니다!

    하지만이 글로벌 선언 된 배열을 유용한 데이터로 채우면 원활하게 처리 할 수 ​​있습니까? 잘못된!

    큰 배열의 요소 10 개를 인쇄했으며 악몽이 깊어졌습니다. 로컬 범위 배열의 10 개 요소는 예상대로 0,0004 초가 걸렸습니다. 그러나 전역 선언 배열의 동일한 요소를 인쇄하는 데 1 분 11 초가 걸렸습니다. 이것은 사실로보기에는 너무 안 좋은 것 같아요. 우리가 말하는 것처럼 Swift 개발자들이 그 위에 있다고 확신합니다.