2013-05-02 2 views
3

일부 해시의 값이 다른 해시의 값인 해시를 사용하고 있습니다.Ruby 해시의 "핵심"기능은 얼마나 비쌉니까?

가치 키를 얻기 위해 key 번을 사용해야하므로 다른 해시에 액세스 할 때 사용할 수 있습니다.

나는 이것이 어떤 성능상의 영향을 줄 수 있는지 궁금해하고있었습니다. 내 상황에서는이 해시 수가 적고 내용도 적지 만 이론적으로 알고 싶습니다.

너무 많이 사용하지 않아야합니까? 키의 값을 얻는 것과 비교하면 어떻게 수행됩니까?

답변

2

이런 식으로 생각해보십시오. 때때로 값을 얻기 위해 추가 단계를 수행하고 있습니다. 조건부 테스트를 사용하고 계산에 몇 단계를 추가 할 때마다 이런 일이 발생합니다.

여기에는 약간의 오버 헤드가 있지만 분명히이 시점에서 조기에 최적화하는 것이 걱정됩니다. 차이점에 대한 느낌을 얻으려면 Benchmark 클래스를 사용하여 해시 키를 가져 오는 다른 방법을 테스트 해보십시오.

상당한 차이를 확인하려면 수백만 개의 루프를해야 할 것으로 생각됩니다. 결과

hash = {a:1, b:2} 
hash.merge!(Hash[hash.values.zip(hash.keys)]) 

: 여기


내가 @fontanus 언급 역 매핑을 생성하는 방법이다

또한 배열로 해시를 강요하여 수행 할 수 있습니다
{ 
    :a => 1, 
    :b => 2, 
    1 => :a, 
    2 => :b 
} 

그것을 평평하게하고 뒤집은 다음 다시 해시로 바꾸는 것입니다. 그러나 나는 이것을 위의 것보다 덜 직관적이라고 봅니다. YMMV.

hash.merge!(Hash[*hash.to_a.flatten.reverse]) 

@steenslag는 Hash.invert를 생각 나게했다. 뭔가 있었지만 메서드 이름을 기억할 수 없다는 것을 알고있었습니다.

 
>> hash.merge!(hash.invert) 
{ 
    :a => 1, 
    :b => 2, 
    1 => :a, 
    2 => :b 
} 

그에게 upvote를 줘!

+0

이전의 최적화는 다른 것들과 함께 모든 악의 근원이다. – fotanus

+0

"조기 최적화"입니다. –

+3

해시에는 다음과 같은 방법이 있습니다. [hash.invert] (http://ruby-doc.org/core-2.0/Hash.html#method-i-invert) – steenslag

1

루비 1.9.3 및 2.0.0에서 검색하는 것은 O (n) 연산입니다. rb_hash_foreach

static VALUE 
rb_hash_key(VALUE hash, VALUE value) 
{ 
    VALUE args[2]; 

    args[0] = value; 
    args[1] = Qnil; 

    rb_hash_foreach(hash, key_i, (VALUE)args); 

    return args[1]; 
} 

구현 :

void 
rb_hash_foreach(VALUE hash, int (*func)(ANYARGS), VALUE farg) 
{ 
    struct hash_foreach_arg arg; 

    if (!RHASH(hash)->ntbl) 
     return; 
    RHASH_ITER_LEV(hash)++; 
    arg.hash = hash; 
    arg.func = (rb_foreach_func *)func; 
    arg.arg = farg; 
    rb_ensure(hash_foreach_call, (VALUE)&arg, hash_foreach_ensure, hash); 
} 

그러나, 당신의 해시가 작다. @theTinMan은 조숙 한 최적화에 대해 정확하며, 걱정하지 않아야합니다.

+1

(1) 사실이 아닙니다. Ruby 2.0 이전의 Ruby 1.9에서는 해시가 주문되었습니다. (2) 해쉬가 정렬되었거나 "키"에 어떤 영향을 미치지 않는가? 나는 아무 이유도 보지 않는다. – sawa

+0

@sawa (1) 감사합니다. Ruby 2가 아니므로 1.9.2입니다. - 잘못된 번호 2. (2) 정렬되지 않은 목록의 요소를 선형 검색보다 빨리 찾을 수는 없지만 목록이 정렬되어 있다는 것을 알고 있으면 다른 검색 알고리즘을 사용할 수 있습니다. – fotanus

+2

어떤 순서로 "정렬 됨"을 사용하고 있습니까? 루비 해시가 주문되었다고하는 상황에서 키가 "정렬"되어있는 것은 아닙니다.삽입 된 키의 순서가 유지된다는 의미입니다. – sawa

관련 문제