리터럴 스트링은 컴파일 타임 해쉬써서 case 에 박아넣고, swtich 에 들어갈 인자만 런타임 해쉬로 넣으면 되지 않음?
[%] strcmp로 if질 말고 switch로 하는 법?
노이ㄴ(liliilli)
2020-04-27 12:21
추천 0
댓글 35
다른 게시글
-
러스트 기반 웹 서버 만들어 보신 분에게 질문 [1][%] 익명(112.217) | 20.04.27추천 0
-
csgo 유출된 소스 누가 깃허브에 올렸네 [4][%] 익명(221.149) | 20.04.27추천 0
-
근데 switch보다 else if가 최적화적으로 더 낫나 [16][%] 익명(223.38) | 20.04.27추천 0
-
Which language is best? [3][%] 익명(205.185) | 20.04.27추천 4
-
여긴 뭐하는 사람들이 모여있는 곳입니까? [2][%] 익명(45.33) | 20.04.27추천 0
-
스파게티 코드가 절대 부끄러운게 아닌 이유 [13][%] 익명(carson) | 20.04.27추천 1
-
termite zzz자문자답이네[%] 익명(211.36) | 20.04.27추천 0
-
내 termite가 이상하다 [1][질문] 익명(211.36) | 20.04.27추천 0
-
아ㅋㅋ 나 게이인가[%] 익명(211.36) | 20.04.27추천 0
-
와ㅋㅋ시발 존나빡새네 [1][%] 익명(211.36) | 20.04.27추천 0
https://llvm.org/doxygen/StringSwitch_8h_source.html
ADT에
미친듯이 환장해서 최적화하는 얘네가 왜 plain cmp를 썼는지 좀 제발 생각좀 쳐 하고 말을 하셈.
모르니까 물어보는거지 생각을 뭘 쳐해
속도 빠른거 원하면 if 또는 case 에 들어가는 걸 함수로 만들고, 그 함수 포인터를 배열에 넣음. 해시 key 를 배열 인덱스가 되게 해시를 자작하고 조건문 안 쓰고 func_array[key]() 이런 식으로 바로 호출하는 방법 있음
ㅎㄹ...
그렇게 하면 개발의 영역이 아니라 수학자의 영역이라 너무 난해하지. 그래서 어떤 방법을 쓰냐면 enum 이나 #define STRING0 0 #define STRING1 1 ... 이렇게 상수를 사용하여 해시 키로 쓰고, 최종적으로 화면에 보여줄 때만 상수를 실제 문자열로 출력하는 방법 있음. 대박이지? ㅋㅋㅋ
내가 아는 한 그 방법이 제일 빠를거다. 컴파일러 책보면 심볼 테이블 만드는 방법 나오고, 위에 소개한 방법이 yacc, lex 공부하다보면 FSM(상태머신)에도 나오는 얘기임.
스트링 구하는 것도 간단한데.. 함수 포인터 배열 만들어 놓고 char *func() { return strdup("HELLO"); ... char *str; str = func_array[HELLO]();
그게 더 느릴거같은데
함수포인터 배열이
if문이 수천개되면 모르겠다
element가 충분히 의미있게 많고 string의 길이가 의미있게 많은게 아니라면 개 느림
개느리긴.. 배열하고 포인터 참조 만큼 빠른게 어딧다고
해시 중에서도 제일 빠른게 배열 해시. 그래서 키 값 구하는게 핵심이지
비킷을 배열로 쓴다는 얘기 키가 배열인덱스 그게 해시 중에 제일 빠르다
오타. 버킷
big O 단위로 생각하면 그렇지 그러니까 아키텍처 공부좀 사셈
하셈*
내가 한 얘기는 책에도 나오는 얘기. 메모리 주소 직접 찾아 가는건데 개느리긴. 컴구 공부나 좀 하세
모든 instruction이 똑같이 1 사이클로 돌면 님 말이 맞음 ㅇㅇ memory fetch랑 indirect instruction들이 얼마나 느린데 ㅋㅋㅋ
전형적인 알고리즘 big O충이네 ㅋㅋㅋㅋㅋㅋㅋㅋ
int func()
int func(int v){ int a[] = {2}; return a[v];}int func(int v){ int a[] = {1}; if (v == 0) return 2; return a[v];}이랑 속도가 같을것같음? ㅋㅋㅋㅋ
아휴.. 저래서 어떻게 프로그래밍하나..
또라이 아냐
ㅅㅂ 어셈 코드라도 가지고 오거나 벤치마크 자료라도 가져와라. 니는 배열도 안 쓰고 개발하냐. 니가 말하는게 틀린 얘긴 아닌데.. 오늘 부터 어셈 쓰고 CPU 레지스터 변수 써라. 설명허기도 쿼찮다
잘만 하고 잘 사는데 ㅋㅋ 갑자기 뜬금없이?
굳이 그렇게 쓰지 않아도 충분히 영향 미칠 수 있음. logical을 bitwise로 바꾼다던지, memory access를 덜 한다던지, side-effect줄이고 zero-idioms더 활용하고 등등. 존나 극단적인 새끼네 ㅋㅋㅋ 왜 그걸 하려고 어셈블리로 짬?
그냥 짧은건 이렇게하면 느리고 긴건 이렇게하면 빠른건데 ㅋㅋㅋ 그거 하나를 인정을 못 하네 ㅋㅋㅋ 븅신
너 말이 맞아.. 근데 한심해서 할 말이 없다. 자료 조금밖에 없으면 애초 해시를 쓰지 않아. 해시가 왜 있는데
glib 라이브러리에 g_signal 관련 함수가 "destroy" signal 에 문자열로 연결하는 방법이 있고 signal_id 숫자로 연결하는 방법 있음. 후자가 내가 위에 소개한 방법이고 실제로 많이 쓰이는 방법임. 위에 개븅신이 초보적인 소리해쌌는데, 그냥 무시하고. 그리고 그 방법이 에러 메시지나 다국어 메시지 출력할 때 사용하는 방법이기도 함
그냥 무시하고 ㅋㅋ 정말 웃기네 평생 그렇게 재밌게 놀아.
그냥 variant 작으면 else if 두르고 variant 개많으면 미리 초기화해둔 해시맵쓰면됨
굳이 리터럴 아니여도 되고 해시충돌도 대응가능
가장 보편적이고 효율적인 정답
짤이랑 다르게 fool이랑 존나 싸우네