1. for(int i = 0; i < count; ++i) deck[i] = i; // 304
2. while(count--) deck[count] = count; // 146
3. --count; while(deck[count--] = count); // 143
4. --count; while(deck[count--] = count, count); deck[0] = 0; // 129
5. while(deck[--count] = count, count); // 146
모두 cached 인 상태에서 수행.
약 50번 수행시 최저 소요시간(clock) 기준으로 주석에 기록.
승자는 역시 --count; while(deck[count--] = count, count); deck[0] = 0;
측정하는 코드가 26클럭 쓰니 저 값들에서 26 빼주면 됨.
대략 52장을 처리하는데 [감소, 대입, 비교, 분기] 하는데 총 2클럭씩 썼다고 보면 됨. 파이프라인 효율을 조금은 본다는거지.
3 4의 차이가?
3, 4의 차이는 반복의 조건으로 배열의 내용을 참조하냐, 아니면 변수 자체를 참조하냐의 차이.
오홋
최대 2배이상차이가 나네 ㅇㅇ...
1,2번은 그렇다 치더라도 3,4번은... 아 파이프라이닝 같은걸 끼얹나?
3번 코드는 옵티마이저가 자동으로 4번으로 바꿔줘야지 옵티마이저가 꼴통이네... 노답...
난 오히려 옵티마이저가 레지스터에 값 넣게끔 알아서 어셈블해서 3번이 더 빠를 줄 알았네...
알아서 그렇게 어셈블 안해주니 노답...
요는 내가 아래에서 너한테 추천했던 루프 구조가 유효하다는거 : )
@청왕 배열에 대입 연산이 저장되길 기다려야 하기 땜에 느린거야.
[간접 어드레싱], 대입, 비교, 감소, 분기 순서로 돌아가는 4번의 경우, 감소와 분기 사이에 브레이크 해서 2클럭을 소모하고 파이프라인으로 슝슝~
참조 타임의 전위형 연산자가 얼마나 비효율적인가를 보여주기도 함 : )
4번 왜 안되지 ?
대신 아예 stall 이 발생해버린 참조시점 전위형 연산의 경우 속도 편차가 심하진 않아. 다 좀 느리지만 거의 일정한 결과를 얻지.
4번이 안된다니?
0번은 값을 안바꾸는걸?
글고 새로고침할때 가끔 코드가 왜 바뀌지 ㅋ
바꾸는걸?
아, 그건 내가 3, 4 번 에 미리 1 감소 시켜서 돌려야 되는 예외를 코드에 명시하기 위해 바꾼거
5번은 새로 추가됨.
새로 고쳤음 봐봐
2010이라 그런가? 12345 넣고 01234 넣을려니 0은 안되는데
코드 바꿨엉.
후 속쉬원
아름다운 논설이군요.
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.