게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c# struct 생성 실험과 의문점
게시물ID : programmer_13966짧은주소 복사하기
작성자 : 시몬스
추천 : 0
조회수 : 552회
댓글수 : 8개
등록시간 : 2015/10/19 13:08:13
옵션
  • 본인삭제금지
[실험1]

        static void Main(string[] args)
        {
            DateTime dt = DateTime.Now;
            for (int i = 0; i < 10000000; i++)
            {
                ABC abc = default(ABC);
                //ABC abc = new ABC();
                //ABC abc = new ABC(null);
            }
            Console.WriteLine((DateTime.Now - dt).Milliseconds);
        }

        public unsafe struct ABC
        {
            public fixed int array[200];
            public ABC(int[] _param) { }
        }



이런 코드가 있습니다.
사용할 수 있는 ABC의 생성자는 3가지죠.


default(ABC);
new ABC();
new ABC(null);



이렇게 3개를 테스해봤습니다.





default(ABC); // 220ms
new ABC();    // 220ms
new ABC(null); //  20ms




default(ABC)와 new ABC()는 같은 로직이라고 생각이되네요.
그런데 new ABC(null)은 10배나 빠른 속도를 나타내네요.









[실험2]

그래서 혹시 null이라서 값을 못쓰는거 아닌가? 하고 좀더 추가해봤습니다.
Set과 Add함수를 만들고 사용한것입니다.

빨간색은 위 소스에서 바뀌거나 추가된것입니다.

        static void Main(string[] args)
        {
            DateTime dt = DateTime.Now;
            int sum = 0;
            for (int i = 0; i < 10000000; i++)
            {
                ABC abc = default(ABC);
                //ABC abc = new ABC();
                //ABC abc = new ABC(null);

                abc.Set(0, 1);
                abc.Add(0, ref sum);
            }
            Console.WriteLine(sum);
            Console.WriteLine((DateTime.Now - dt).Milliseconds);
        }

        public unsafe struct ABC
        {
            public fixed int array[200];
            public ABC(int[] _param) { }

            public void Add(int idx, ref int sum)
            {
                fixed (int* p = array)
                {
                    sum += p[idx];
                }
            }
            public void Set(int idx, int val)
            {
                fixed (int* p = array)
                {
                    p[idx] = val;
                }
            }
        }


default(ABC); // 300ms
new ABC();    // 300ms
new ABC(null); //  90ms


??? 또 new ABC가 빠르게 나왔습니다.




[실험3]

Set을 1번만 하고 Add를 여러번 해봤습니다.

        static void Main(string[] args)
        {
            DateTime dt = DateTime.Now;
            int sum = 0;
            for (int i = 0; i < 100000; i++)
            {
                ABC abc = default(ABC);
                //ABC abc = new ABC();
                //ABC abc = new ABC(null);

                abc.Set(0, 1);
                for(int j=0; j<100; j++)
                {
                    abc.Add(0, ref sum);
                }
            }
            Console.WriteLine(sum);
            Console.WriteLine((DateTime.Now - dt).Milliseconds);
        }

        public unsafe struct ABC
        {
            public fixed int array[200];
            public ABC(int[] _param) { }

            public void Add(int idx, ref int sum)
            {
                fixed (int* p = array)
                {
                    sum += p[idx];
                }
            }
            public void Set(int idx, int val)
            {
                fixed (int* p = array)
                {
                    p[idx] = val;
                }
            }
        }




default(ABC); // 50ms
new ABC();    // 50ms
new ABC(null); //  50ms




?????????

ABC의 속도가 느려질 수도있다고 생각했는데 하향평준화돼버렸습니다.





이유가 뭘까요..? 궁금해죽겠네요.
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호