해시키가 배열 인덱스가 되고 함수배열[key]() 이렇게 바로 호출. if case 아예 안 씀. 메모리 직접 찾아가서 콜 하는 방식임.
루비(117.111)2020-04-27 12:49
답글
dense hash map을 구현하겠다고 말하는것같은데 진짜 element가 충분히 많고, string의 길이가 충분히 길지 않는한 훨 씬 느림.
.(115.88)2020-04-27 15:23
답글
일단 dynamic function dispatch하는 순간부터 inline된 if문 속도 절때 못따라감 아키텍처 다시 배우고오셈. vtable이 is-a model보다 느린 이유랑 똑같음.
.(115.88)2020-04-27 15:26
답글
115 얘는 잘 알지도 못하면서 잘난체 하는데, 에러 메시지, 다국어 메시지 처리, 메시지 카달로그 방식에 그런 방식이 쓰인다.
여러 문자열 수백에서 수천 있다고 하면 문자열 배열을 만들어서 [index] 해서 꺼내 쓴다. 일종의 해시 방식이지.
index 를 HELLO, HI, THERE, NOT_FOUND... 이런 식으로 enum, define 해줘도 되고. 문자열은 이렇게 처리하고,
if ... else .. 여기 안에 로직 들어가고 막 그러면 함수 포인터 배열 쓰고. 그렇게 하면 됨. 실제로 그러한 방식이 쓰임.
if ... else 이런걸 수백개 쓰는 건 무식한 방법이지. 500개 썼다고 할 때, 비교만 500백번을 하더덩.
그런걸 방지하기 위해 해시 방식을 씀. 아니면 2진탐색 등을 하던가
루비(218.147)2020-04-27 19:39
답글
마직막거 걸릴 때 비교 500번이라는 얘기.
루비(218.147)2020-04-27 19:40
답글
500 * strcmp() 까지 고려하면... 컴터 죽겠다 ㅠㅠ
루비(218.147)2020-04-27 19:41
if도 길어지면 결국 점프 테이블 만든다고 들었는데
Penguin(175.208)2020-04-27 12:04
strcmp를 switch를 어떻게 함? 그리고 글자가 짧으니 그냥 cmp하는게 당연히 훨씬 빠르지. fasthash해서 해시 충돌날거 생각하면 차라리 16 byte align맞춰서 8바이트 비교하겠다.
.(115.88)2020-04-27 12:07
답글
파이선같은걸 쓰다보니 뇌가 절여져서 그만...
익명(223.38)2020-04-27 12:08
답글
저렇게 string이 짧은 경우에는 내가 설명한것처럼 hash key가 앞의 8바이트고 comparer가 뒤의 x바이트인 hash set만들면 해결됨. 이쪽 관련해서 최적화 연구 많이 하는 사람인데 이 이상으로 빠른거 없음.
strcmp라서
똑같다 해시로 해야지
해시 개느린데
언어에서 지원하는 범용 해시 말구 자작 해시 써야지
그것도 느린데 뭔 소리지 ㅋㅋㅋ 그리고 범용 해쉬 해쉬중에서는 엄청나게 빠른데
함수 포인터 배열 써야지
해시키가 배열 인덱스가 되고 함수배열[key]() 이렇게 바로 호출. if case 아예 안 씀. 메모리 직접 찾아가서 콜 하는 방식임.
dense hash map을 구현하겠다고 말하는것같은데 진짜 element가 충분히 많고, string의 길이가 충분히 길지 않는한 훨 씬 느림.
일단 dynamic function dispatch하는 순간부터 inline된 if문 속도 절때 못따라감 아키텍처 다시 배우고오셈. vtable이 is-a model보다 느린 이유랑 똑같음.
115 얘는 잘 알지도 못하면서 잘난체 하는데, 에러 메시지, 다국어 메시지 처리, 메시지 카달로그 방식에 그런 방식이 쓰인다. 여러 문자열 수백에서 수천 있다고 하면 문자열 배열을 만들어서 [index] 해서 꺼내 쓴다. 일종의 해시 방식이지. index 를 HELLO, HI, THERE, NOT_FOUND... 이런 식으로 enum, define 해줘도 되고. 문자열은 이렇게 처리하고, if ... else .. 여기 안에 로직 들어가고 막 그러면 함수 포인터 배열 쓰고. 그렇게 하면 됨. 실제로 그러한 방식이 쓰임. if ... else 이런걸 수백개 쓰는 건 무식한 방법이지. 500개 썼다고 할 때, 비교만 500백번을 하더덩. 그런걸 방지하기 위해 해시 방식을 씀. 아니면 2진탐색 등을 하던가
마직막거 걸릴 때 비교 500번이라는 얘기.
500 * strcmp() 까지 고려하면... 컴터 죽겠다 ㅠㅠ
if도 길어지면 결국 점프 테이블 만든다고 들었는데
strcmp를 switch를 어떻게 함? 그리고 글자가 짧으니 그냥 cmp하는게 당연히 훨씬 빠르지. fasthash해서 해시 충돌날거 생각하면 차라리 16 byte align맞춰서 8바이트 비교하겠다.
파이선같은걸 쓰다보니 뇌가 절여져서 그만...
저렇게 string이 짧은 경우에는 내가 설명한것처럼 hash key가 앞의 8바이트고 comparer가 뒤의 x바이트인 hash set만들면 해결됨. 이쪽 관련해서 최적화 연구 많이 하는 사람인데 이 이상으로 빠른거 없음.