루비에서는 중복 요소가 없어야하는 (아마도 커다란) 배열을 생성하고 리턴하는 메소드를 빌드하고 있습니다. 집합을 사용하고 배열로 변환하여 성능을 향상시킬 수 있습니까? 아니면 내가 그것을 반환하기 전에 사용하고 배열에 .uniq
를 호출하는 것이 더 낫겠습니까? 또는 배열 +=
대신에 &
을 사용하여 항목을 추가하는 것은 어떻습니까? 그리고 내가 세트를 사용한다면, 세트에 넣고있는 객체에 <=>
메소드를 가지지 않을 경우 성능에 영향을 미칩니 까? (확실하지 않은 경우이를 테스트하는 방법을 알고 있습니까?)세트 성능 루비의 배열
2
A
답변
5
진짜 대답은 가장 읽기 쉽고 유지 보수가 가능한 코드를 작성하고 그것이 병목 현상이라고 표시 한 후에 만 최적화하는 것입니다. 알고리즘이 is in linear time 인 경우 알고리즘을 최적화 할 필요가 없습니다. 여기가 ... 당신이 제안하는 방법을 아주 확실하지
을 쉽게 찾을 수 있지만, 내 fruity
보석을 사용하여 :
require 'fruity'
require 'set'
enum = 1000.times
compare do
uniq { enum.each_with_object([]){|x, array| array << x}.uniq }
set { enum.each_with_object(Set[]){|x, set| set << x}.to_a }
join { enum.inject([]){|array, x| array | [x]} }
end
# set is faster than uniq by 10.0% ± 1.0%
# uniq is faster than join by 394x ± 10.0
을 분명히, 그것은 세 번째 방법처럼 중간 배열을 구축 이해되지 않는다. 그렇지 않으면, 당신이 O(n)
에있을 것이기 때문에 큰 차이를 만들지 않을 것입니다; 그게 중요한거야. BTW
sets
,
uniq
및
Array#|
사용하여 객체에
eql?
및
hash
하지
<=>
. 기본값은 객체가 (
this question 참조) 인 경우가 아니면
eql?
이 아닙니다.
을 기본값으로 사용하므로 절대로 정의 할 필요가 없습니다.
3
Benchmark 라이브러리를 사용해 보셨습니까? 테스트는 일반적으로 매우 쉽게 구성 할 수 있으며 특정 버전의 Ruby에서 작동하는 방식을 올바르게 반영합니다.
관련 문제
- 1. 해시 세트 및 배열 목록 성능
- 2. 루비의 차단 목록에 배열 배열
- 3. 루비의 배열 구문 정렬
- 4. 루비의 이상한 배열 테스트
- 5. 루비의 배열 크기에 제한이 있습니까?
- 6. 문자열을 루비의 배열 내용으로 바꾸시겠습니까?
- 7. 세트 배열 길이는 C#
- 8. three.js 성능 문제의 텍스처 세트
- 9. 중첩 세트 인덱스 및 성능
- 10. 아이언 루비의 성능 문제가 여기에 변수
- 11. iOS 배열 및 세트 비교
- 12. 루비의 특정 배열 값의 합을 계산 하시겠습니까?
- 13. 루비의 각 사용자에 대한 전역 배열 만들기
- 14. 루비의 다차원 해시에 배열 할 문자열
- 15. 배열 대지도의 성능
- 16. 다차원 배열 중복 - 성능
- 17. 할당 가능한 배열 성능
- 18. 배열 성능 질문
- 19. MongoDB 임의의 데이터 세트 성능 찾기
- 20. 배열 구조체 또는 배열 구조 성능
- 21. 루비의 클래스 (루비의 클래스 선언)
- 22. 루비 배열 교차 성능 문제
- 23. Javascript 정렬 배열 기능 성능
- 24. 중첩 세트 PHP 배열 및 변환
- 25. 루비의 음역
- 26. 루비의 미적분
- 27. 루비의 시간대
- 28. 루비의 '또는'대 '||'
- 29. 루비의 LoadError
- 30. 루비의 시퀀스