최적화 관련 질문입니다..
글쓴이: terra / 작성시간: 일, 2003/07/13 - 2:53오후
안녕하세요.. 매일 와서 글 읽기만 했지,
처음으로 글을 올리는 것이라, 조금 긴장이 되네요.
지금 만들고 있는 프로그램이 너무 느려서 최적화를 진행하고 있는중에,
이런것이 컴파일러에 의해서 최적화가 되는지 궁금해서 질문 올립니다.
1. memcmp(buf, "hello world", strlen("hello world")) 2. memcmp(buf, "hello world", 11)
지금 코드가 1번 처럼 되어 있는것이 많은데 이것을 2번으로 바꾸게 되면,
가독성이나.. 문자 개수를 세는데 오류가 발생할 가능성도 있고.. 아무튼 조금 안좋은것 같구요..
그렇지만 이것이 최적화가 되지 않는다면 2번으로 바꿔야 할것 같습니다.
위와 비슷한 연산들에 대해서 자동으로 컴파일러가 최적화를 해 주는지 궁금합니다.
Forums:
당연합니다.
strlen()에서 문자 갯수 세는 작업을 하지 않기 때문에 속도
빨라지죠.
하지만 이걸 컴파일러 최적화라고 보기는 무리입니다.
사용자가 불필요한 연산을 최대한 줄이는 알고리즘을 적용한 것이지.
하지만 원래 길이가 일정치 않은 문자열을 받아들여야 하는 경우에는
strlen()을 써야겠죠.
Written By the Black Knight of Destruction
strcmp 쓰면 안되요?
strcmp 쓰면 안되요?
[quote="minzkn"]strcmp 쓰면 안되요?[/quote]
strcpy,strncpy를 말씀하시려던 것은 아니신지?
단 hello world에 \0이 들어가지 않는다는 전제 조건하에 ㅋㅋ
그럼 strlen도 소용없나? ㅋㅋ
전에 이런 오류를 범하시는 분이 기억이나서..
There is no spoon. Neo from the Matrix 1999.
Re: 최적화 관련 질문입니다..
strcmp나 strncmp는 안되고요?
그러나 제 생각에는 1이 2로 최적화되지는 않을 것 같습니다.
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
뭐.. 그냥 확인해 보니..
'strcmp'에 대해 제가 올린글은 아니지만...
뭐 그냥 확인해 보니...
strcmp 맞는거 같네요...
[quote="지리즈"][quote="minzkn"]strcmp 쓰면 안
죄송합니다. memcpy로 잘못 보았습니다.
There is no spoon. Neo from the Matrix 1999.
Re: 최적화 관련 질문입니다..
컴파일러 나름이겠지만, 1번 문장을 2번 문장과 동일하게 컴파일할 정도의 지능적인(?) 컴파일러가 있을지는 의문입니다.
둘 중의 어떤 코드가 더 나을지는 위의 코드만 보고 결정하기는 어렵습니다. 하지만 속도가 매우 매우 중요하다면 이런 방법은 어떨까요?
그리고 문자열의 비교라면 memcmp 보다는 strncmp를 사용하기를 권장합니다. C99 표준문서의 7.21.4.1 The memcpy function 항목에서는 다음과 같이 경고하고 있습니다.
"Strings shorter than their allocated space and unions may also cause problems in comparison."
strncmp는 '\0' 문자 이전까지 비교하는데 비해서 memcmp는 무조건 지정된 갯수의 character를 비교합니다. 이로 인해서, 지정된 길이보다 짧은 문자열들을 서로 비교할 경우 memcmp는 같은 내용의 문자열임에도 그 뒤의 쓰레기값으로 인하여 서로 다르다는 판정을 내릴 수 있습니다.
자세한 것은 아래 링크의 글을 읽어보시길 바랍니다.
http://groups.google.co.kr/groups?threadm=6ddtp3%245hv%241%40news.utdallas.edu
[code:1]$ cat > strlen.cint main
-O3 옵션을 주니 strlen을 실제로 호출하는 대신, 컴파일 단계에서 미리 길이를 계산해서 상수로 대체시키는군요.
따라서 둘 중 고르라면 가독성이 좋은 1번이 나을거 같습니다.
하지만 윗분들 말씀대로 문자열 비교시에는 strcmp/strncmp가 memcmp보다는 더 좋은 방법입니다.
이거참 중대한 결함이 있는 코드를 사용하실거 같아서 한가지 덧붙입니다.
이거참 중대한 결함이 있는 코드를 사용하실거 같아서 한가지 덧붙입니다.
만약 memcmp를 쓰시고자 한다면
이것을 생각해보세요.
이것은 다음과 같은 예외를 아주 멋지게 통과하는 버그가 있습니다.
if( CmpToken( "Hello world !", "Hello world" ) == 0)printf("OK\n");
else printf("ERROR\n");
무슨예기인지 이해가십니까?
실제로 memcmp 사용시 주의할 사항은 이점입니다.
이것이 올바른 코드입니다.
사실상 memcmp는 뒤에 길이만큼을 무조건 전부 비교하지 않습니다.
"같은동안 길이를 비교" 라는 뜻이 맞을겁니다.
때문에 어느한쪽이라도 그 문자열이 고정된 상수라면
문제가 발생할 이유가 없습니다.
하지만 양쪽 비교 대상이 가변이라면 반드시 memcmp는 좋은 방법은
아닐겁니다.
strlen("hello, world") 와 11 당연히 11 상수를
strlen("hello, world") 와 11
당연히 11 상수를 주는게 빠르지 않을까요?
strlen() 연산을 하려면 11번 if 문장이 11번 들어가야 할텐데 그냥 11 하면 되쟎아요. 가독성이 떨어진다면 #define 도 괜챦은 방법같고.
또 strncmp 보다는 memcmp 가 훨씬 더 빠를것 같은데,
왜냐면 memcmp()는 한 바이트씩 비교해 가다가 최대로 정해진 바이트 수만큼 비교하는데 비해
strncmp 는 매 한 바이트마다 같은지 비교하고 또 0x00 인지도 일일이 확인하게 되므로 연산속도가 느려질것 같네요.
내 자식들도 나처럼 !!
혹시.. sizeof 를 사용하면 되지 않을까 싶네요..
처음 질문을 올리신 분께서 원하셨던게..
strlen("...") 처럼 안전하고 11처럼 빠른 코드를 원하셨던게아닌가요?
sizeof("...") 를 사용하시면 될 것 같습니다.
sizeof로 하는게 어떨지...
컴파일타임에 고정된 문자열이라면
정도가 좋을것 같군요. strMsg를 포인터로 하는 치명적인 실수만 없다면요... ^^;
근데 strMsg가 컴파일타임에 고정된 것이 아니라면 strcmp나 비슷하게 만드는
수밖에 없을 듯한데요...
뭐 이정도로 만들면 0으로 끝나는 문자열 검사는 될거 같네요...
memcmp를 쓴걸 보면 문자열 검사도 아닌거 같긴 한데 그럴 경우엔 음...
별로 방법이 없어보이네요. 길이를 어디선가 구해야 되니까... 길이를 가지고
있는 버퍼를 사용하거나 뭐 그래야 될것 같군요.
--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;
아 답변주신 분들 모두 대단히 감사 드립니다..어제 글을 올렸는데 이
아 답변주신 분들 모두 대단히 감사 드립니다..
어제 글을 올렸는데 이렇게나 답이 많이 올라왔네요.. 정말 감사 드립니다.
주요한 논쟁은 strcmp, memcmp 의 문제 였는데요..
제 프로그램의 경우, 한쪽 비교 대상이 문자열 상수로 한정되어 있었기에 고정길이의 memcmp를 사용하였습니다. 이부분은 괜찮은것 같구요..
sizeof()를 고려해 보았으나.. 지금 테스트를 해보니
최종 선택은 이 방법이 가장 안전하고 빠를것 같습니다..
답글 주신 모든 분들께 정말 감사 드립니다.
마지막이시라지만.. ^^
sizeof(...) + 1 하시면 되잖아요.. ^^
Re: 마지막이시라지만.. ^^
저도 개인적으로는 sizeof(...) - 1이 낳을듯... ^^ 그럼 고운 하루
=========================
CharSyam ^^ --- 고운 하루
=========================
찾아보니 glibc 2.3.1 - i686 에 최적화 되면 strcmp
찾아보니 glibc 2.3.1 - i686 에 최적화 되면 strcmp 및 memcmp는
다음의 코드를 가지게 되는군요.
굉장히 철학적이고도 작고 빠르고! 딱 제가 추구하는 코드네요.
결국 memcmp가 약간의 속도 우월성을 보이는 것은 당연하고요.
참고로 memcmp는 i386이후 별로 최적화할 건더기가 없군요.
댓글 달기