__int64 getRDTSC()
{
__asm rdtsc;
}
...
__int64 begin = getRDTSC();
--count; while(deck[count--] = count, count); deck[0] = 0; // 129 clocks
printf("%d ", int(getRDTSC() - begin));
그러하다.
그리고 미리 캐시를 채울지 말지 결정하는데, 채우는게 속편함.
__int64 getRDTSC()
{
__asm rdtsc;
}
...
__int64 begin = getRDTSC();
--count; while(deck[count--] = count, count); deck[0] = 0; // 129 clocks
printf("%d ", int(getRDTSC() - begin));
그리고 미리 캐시를 채울지 말지 결정하는데, 채우는게 속편함.
응 VC++ 은 intrinsic 에서 지원해줘. 근데 저거 없는 컴파일러에서도 인라인만 지원하면 내 방법대로 됨.
내부적으로 똑같아. 속도도 같고.
어라 돌려보니 가끔씩 __rdtsc(); 가 더 빠르넹 21 클럭도 나온다.
내가 보여준건 끽해야 26 클럭이던데
129 던 저 루프가 126도 뜸. ㅋㅋ
올 120도 뜬다. 뭐지
걍 unsigned 차이군. =_=
심플하고 좋구나
근데 확실히 n 을 100개 보다 크게 할때랑 속도 차이가 있다. for 문이 n 이 클수록 유리한거 같아.
작게 함수단위로 많이 돌때랑 크게 한번 돌때랑도 비교해봐야 할듯
하하 52장 초기화 하는 작은 함수로 만들어서 10000 번씩 돌리니 for 는 한 번 돌리는 효과고(컴파일 타임에서 소거됨) while 은 다 누적되네 ㅋ
컴파일러가 for로 장난 많이 치는구낭.
내꺼에서 어셈보니까 for문도 점프 뛰던뎅
조금 최적화 하기 힘든 block 을 넣어봐야 성능체크가 제대로 되겠는걸? ㅋㄷ
52번 도는 함수 하나 뽑아 돌려봐 잼씀.
그 함수를 10000번 돌려봐.
volatile ㄱㄱ
하긴, 예전에도 그래서 결과값 종속성 걸어서 돌리곤 했지.
응 volatile 도 좋고.
2000년도 중반에 어셈으로 memset 32 비트 단위 클리어 만들어서 돌리다가 for 쓰니까 더 빠르고 이러더라고 ㅋㄷㅋㄷ
2000년대 초반 중반을 경계로 컴파일러 최적화가 많이 바뀌긴 한듯.
나는 비주얼스튜디오만써서 잘 모르지만
기본 제공함수들 성능도 장난아니게 향상된거 같음
대표적으로 들어 operator new / delete 의 경우 다중스레드에서 스레드당 n개 * 스레드수 할때
아까 300클럭 대 나오던 for 문을 함수로 싸서 1회 돌리니 2 배 빨라짐. 배쨈.
속도가 풀이 아예 스레드마다 따로 잡히는거 아닌가 싶을 정도로
volatile 하니 함수로 뜯어낸 while 이 두 배 느려짐. for 는 두 배 빨라짐. 이거 개그. 컴파일러 최적화에 의해 어셈블리 지식이 똥으로 가는 순간.
그래 차라리 어셈블리로 다 바르는게... 이건 아니군 낄낄.
어셈 너무 어려움
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.