2013-02-07 2 views
3

나는 ByteArray의 두 인스턴스를 결합하는 가장 효율적인 방법은 무엇입니까?

b := #[10 11 12 13] asOrderedCollection. 
b addAll: #[21 22 23 24]. 
b asByteArray 

이 작업을 수행하는보다 효율적인 방법이 가족 이죠, Cuis 또는 Pharo 스몰 토크에서이 ByteArray의 두 인스턴스를 가입하려는?

+3

'효율적인'을 정의하지 않았습니다. 나는 당신이'표현형','이해 가능'또는'리팩토링 가능'이 아닌 '빠름'을 의미한다고 가정하겠습니다. 그래서 제안 된 답변 중 어느 것도 실제로 제안한 것과 타이밍 결과가 일치하지 않는다는 사실에 관심이 있습니다. 스몰 토크는 흥미로운 언어이며, 때때로 가상 머신도 더 재미 있습니다. 속도에 대해 걱정할 경우 측정, 측정, 측정이라는 주제에 대한 자습서 (2 년 전)를 주면서 중요한 요점 중 하나가 반복해서 반복되었습니다. 항상 가정하고 가정을 다시 점검하십시오. –

답변

8

연결이 더 좋습니까 ...?

#[10 11 12 13],#[21 22 23 24 ] 
+0

연결이', otherCollection을 호출합니다. \t "두 개의 문자열 또는 컬렉션을 연결합니다." \t \t^자기 copyReplaceFrom : 자기 사이즈 + 1 \t \t : 자기 크기 \t \t : otherCollectioncode' –

+0

#copyReplaceFrom 님 :와 : #replaceFrom를 호출하려면 다음과 : startingAt :. 사실 콜린 퍼트 니가 제안한 바로 그 것 같습니다. 맞습니까? –

3

예. OrderedCollection을 사용하면 여러 가지 불필요한 개체 할당과 중복 복사가 발생합니다. 당신은 새로운 바이트 배열을 만들고 그것으로 소스 배열의 내용을 복사해야합니다

a := #[10 11 12 13]. 
b := #[21 22 23 24]. 
c := ByteArray new: (a size + b size). 
c replaceFrom: 1 to: a size with: a startingAt: 1. 
c replaceFrom: a size + 1 to: c size with: b startingAt: 1. 

이는 새로운 된 ByteArray를 할당하고 프리미티브와 복사를 수행, 그래서 매우 빠르다. 그것은 Squeak, Cuis 및 Pharo에서 작동 할 것이고 다른 스몰 토크에서도 가능할 것입니다.

+2

귀하의 솔루션이 확실히 유효하지만 지나치게 복잡합니다. #을 사용한 연결은 작업을 수행합니다 – camillobruni

+0

이 응답은 프리미티브로 구현 된 #replaceFrom : to : with : startingAt : 메소드를 직접 호출하기 때문에 유용합니다. 따라서 이것이 효율적이라는 것을 쉽게 알 수 있습니다. –

관련 문제