2017-02-18 1 views
1

데이터 마스크 기능을 만들려고합니다.인덱스/데이터 마스킹에서 최상의 데이터 가져 오기/설정

  1. 사용하여 데이터 첨자 데이터로부터 배열을 생성

    • 매우 느린
  2. , 변경 후

      다시 변환 :

      나는 두 가지 방법을 발견
    • ~ 70 배 빠른
    • 사용 2 배 더 많은 메모리

데이터 첨자가 너무 느린 이유는 무엇입니까? 메모리를 복제하지 않고 인덱스에서 uint8을 가져 오거나 설정하는 더 좋은 방법이 있습니까? 합니다 (Data 값을 첨자를 통해) 첫 번째 방법은 속도가 느린 이유

var data = Data(bytes: [UInt8](repeating: 123, count: 100_000_000)) 

let a = CFAbsoluteTimeGetCurrent() 

// data masking 
for i in 0..<data.count { 
    data[i] = data[i] &+ 1 
} 

let b = CFAbsoluteTimeGetCurrent() 

// creating array 
var bytes = data.withUnsafeBytes { 
    [UInt8](UnsafeBufferPointer(start: $0, count: data.count)) 
} 
for i in 0..<bytes.count { 
    bytes[i] = bytes[i] &+ 1 
} 
data = Data(bytes: bytes) 

let c = CFAbsoluteTimeGetCurrent() 
print(b-a) // 8.8887130022049 
print(c-b) // 0.12415999174118 

답변

1

내가 정확히 말할 수 없습니다 :

여기 내 테스트입니다. 인스 트루먼 트에 따르면, 많은 시간 NSMutableData 개체에서 메서드를 호출 할 때 objc_msgSend에 지출됩니다.

하지만 당신은 배열에 데이터를 복사하지 않고 바이트를 변이 할 수 있습니다 빨리 "복사 배열에"방법보다 더입니다

data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) -> Void in 
    for i in 0..<data.count { 
     bytes[i] = bytes[i] &+ 1 
    } 
} 

.

  • 데이터 첨자 : 7.15 초
  • 복사 배열에 다시 : 0.238 초
  • withUnsafeMutableBytes : 맥북에

    나는 다음과 같은 결과를 얻었다 0.0659 초
관련 문제