|
안녕하세요. 재미있는 실험을 하셨군요^^
제가 돌려보니 ++Ddd.Ccc.Bbb.Aaa.aaa와 ++AAa->aaa 가 같은 시간이 걸리는것 같습니다.
초기화를 하던 안하던 첫번째가 빨리 될때가 있고 두번째가 빨리 될때도 있습니다. 이 시간차는 시간 계산하는 중에 발생하는것으로 보이고 초기화에 상관없이 ++Ddd.Ccc.Bbb.Aaa.aaa와 ++AAa->aaa 는 같다고 보시면 됩니다.
실제 디스어셈블 시켜 코드를 보면 for 문으로 들어가기전에 이미 ++Ddd.Ccc.Bbb.Aaa.aaa와 ++AAa->aaa의 주소는 다 계산되어 레지스터에 저장된 후 for문 안에선는 이 주소에 있는 값을 단순히 증가시키는 일만 합니다. 실제 디스어셈블시킨 코드상에서도 두 방식이 for문 안에서는 같은 코드입니다. 단지 주소를 저장하고 있는 레지스터가 틀린것 뿐인데 레지스터들도 각각이 특기가 있어서 시간차가 조금은 있지만 예전 XT 컴퓨터가 아닌 이상 무시할 정도로 작다고 보시면 됩니다.
결론-> 운영체제가 작업 분할 중에 발생되거나 시간 계산중에 발생된 오차일 뿐 같은 시간이 걸립니다.^^
최민희 님이 쓰신 글 :
: -------------------------------------------------
: typedef struct AAAAA
: {
: int aaa;
: int bbb;
: int ccc;
: }AAA;
:
: typedef struct BBBBB
: {
: int aaa;
: int bbb;
: int ccc;
: AAA Aaa;
: }BBB;
:
: typedef struct CCCCC
: {
: int aaa;
: int bbb;
: int ccc;
: BBB Bbb;
: }CCC;
:
: typedef struct DDDDD
: {
: int aaa;
: int bbb;
: int ccc;
: CCC Ccc;
: }DDD;
:
: DDD Ddd;
:
: Ddd.Ccc.Bbb.Aaa.aaa = 0;
: int itime = GetTickCount();
: for(int i=0; i<10000000; i++)
: {
: ++Ddd.Ccc.Bbb.Aaa.aaa;
: }
: itime = GetTickCount() - itime;
: Memo1->Lines->Add("---1----" + IntToStr(Ddd.Ccc.Bbb.Aaa.aaa));
: Memo1->Lines->Add(itime);
:
:
: AAA *AAa;
: AAa = &Ddd.Ccc.Bbb.Aaa;
: AAa->aaa = 0;
: itime = GetTickCount();
: for(int i=0; i<10000000; i++)
: {
: ++AAa->aaa;
: }
: itime = GetTickCount() - itime;
: Memo1->Lines->Add("---2----" + IntToStr(AAa->aaa));
: Memo1->Lines->Add(itime);
: -----------------------------------------------------------------
:
:
:
: ++Ddd.Ccc.Bbb.Aaa.aaa;
: ++AAa->bbb;
: 이 두게 중 어느게 더 빠를까 보다가
: AAa->bbb = 0;
: Ddd.Ccc.Bbb.Aaa.aaa = 0;
: 이렇게 초기화를 하고 실행하면 ++AAa->bbb; 이렇게 쓰는게 느리고
: 초기화를 빼고 하면 ++Ddd.Ccc.Bbb.Aaa.aaa; 이게 더 느리고
: 하네요 왜 그런지 아시는 분 설명좀 부탁드립니다.
: 그냥 궁금합니다..
:
|