2011-03-17 4 views
4

최근에 주문 보존 해시를 사용하면 코드를 읽기 쉽고 사용하기 쉽게 만드는 Perl의 상황이 발생했습니다. 검색을 조금 해본 후에 Tie :: IxHash CPAN 모듈에 대해 알아 냈습니다.이 모듈은 내가 원하는 것을 정확하게 수행합니다. 내가 바람에주의를 기울이기 전에 그것을 사용하기 시작하기 전에, 그것이 어떻게 작동하는지 그리고 어떤 종류의 성능을 기대할 수 있는지 더 잘 알고 싶다.Tie :: IxHash는 Perl로 어떻게 구현 되었습니까?

내가 아는 바로는 연관 배열은 대개 실제로 사용 해본 적이없는 시도로 구현되지만 성능이 내 기대에 부합한다는 것을 알고 있습니다 (필자는 많은 읽기와 쓰기가 필요할 것으로 예상 함). , 항상 삽입 주문 키를 기억해야합니다. 내 문제는 이것이 넥타이 :: IxHash가 만들어진 방법인지 아니면 어떤 종류의 성능을 기대해야하는지, 아니면 나를 위해 더 좋고/깨끗한 옵션이 있는지 파악할 수 없다는 것입니다. 별도의 배열과 해시를 사용하면 코드와 공간이 비효율적으로 생성되므로 필요한 작업을 수행 할 수 있습니다. 나는 또한 호기심에 호기심이 많습니다. trie로 구현되지 않은 경우 어떻게 구현 되었습니까? 나는 소스 코드를 찾을 수 있다는 것을 알고 있지만, 다른 누군가가 이미이 작업을 수행하기를 바라고 있으며, 나는 그 대답에 관심이있는 유일한 사람이 아니라고 추측한다.

그래서 ... 아이디어가 있습니까? 제안? 조언?

+2

도 참조하십시오. moritz 's :: Hash :: Indexed (http://search.cpan.org/perldoc?Tie::Hash::Indexed)는 Tie :: IxHash와 유사하지만 XS로 작성되었습니다. 그리고 약 2 배 빠른. – dwarring

+0

나는 이것을 시험해 보았고 IxHash보다 빨리 필요한 모든 것을 성취했다. 안타깝게도, 내가 사용하도록 강요당하는 서버의 라이브러리에는 설치되지 않았으며 설치가 허용되지 않는다고 들었습니다. 그래서 Tie :: IxHash가 붙어 있습니다. – Eli

답변

9

Tie::IxHash 개체는 기대하는 정규 Perl 구성 요소를 사용하여 직접적인 방식으로 구현됩니다. 구체적으로 이러한 객체는 4 개의 원소를 가진 축복 된 배열 참조입니다.

  • [0] 사용자 해시 키를 저장하는 해시 참조입니다. 이것은 모듈이 키의 존재를 검사 할 필요가있을 때마다 사용됩니다.

  • [1] 사용자 해시 키를 순서대로 저장하기위한 배열 참조입니다.

  • [2] 값을 순서대로 저장하는 병렬 배열 참조.

  • [3] 두 개의 병렬 배열 내에서 현재 위치를 추적하는 정수입니다. 이것은 반복에 필요합니다.

성능과 관련하여 좋은 benchmark은 일반적으로 추측 이상의 가치가 있습니다. 내 생각 엔 정렬 된 키와 값을 보유하고있는 배열은 조정이 필요하기 때문에 가장 큰 성능 저하가 삭제된다는 것입니다.

+1

나는 약간의 조사와 벤치마킹을 혼자서했지만 여기에 결과를 언급하는 것이 유용 할 수 있다고 생각했습니다. 기본적으로 모든 일반 해시 연산은 O (n) 인 삭제를 제외하고는 O (1)이며, 삭제 된 항목을 지나친 전체 [0] 해시가 재정렬되어야하므로 큰 해시를 처리 할 때 매우 느립니다. 시프 팅은 theta (n)에서 실행될 때 더 느립니다 (항상 n 번의 반복이 필요함). 내가 보았던 다른 모든 표준 배열과 해시 연산은 O (1)이므로 기본적으로 삭제 또는 이동하지 않는 한 (푸시를 사용하는 방법을 찾으십시오), 사용하기에 꽤 좋은 모듈입니다. – Eli

1

source은이 기능이 어떻게 구현되고 성능을 측정하는지 알려줍니다.

+1

필자는 특히 내 질문에 나와 나와 같은 질문을 가진 다른 사람들에게 도움이 될 것이라고 생각한다고 대답했다. 나는 그것을 위해 근원을 걸어 나갈 수 있다는 것을 알고 있지만, 이것은 사람들에게 더 쉽게 사용할 수있는 뭔가로 나를 공격합니다. 필자가 모듈 작성자 인 경우 문서에 넣었을 것이지만, 필자가 아니기 때문에 여기에서 토론하는 것이 최선의 선택이었다. – Eli

+1

그러면 처음 60 줄만보십시오.그것은 당신이 알고 싶은 것의 90 %를 말해 줄 것입니다. – mob

+0

하지만 원래 질문에서 이미 알고있는 답변과 의견으로 주제를 어지럽히는 대신 여기에서 내가 알고 싶은 것의 100 %를 가지고 있다면 더 좋지 않을까요? – Eli

관련 문제