개발 이야기/Visual C#2011. 4. 21. 20:48

벌써 3번째입니다. ^^
오늘 주제는 작은 함수에 대한 부분인데요. 여기서 말하는 함수라는 것은 메서드단위로 생각하시면 됩니다.
사실 메서드 보다는 JIT에 대한 이해라고 생각하셔도 됩니다.

 
아시다시피 우리가 작성하는 C#, VB기타 소스코드는 컴파일되면 MSIL이라는 중간언어로 생성됩니다. 이는 닷넷런타임에서 JIT컴파일러가 이 MSIL코드를 머신(machine) 코드로 바꾸도록하는 것이지요~ 여기서 JIT 컴파일러가 IL코드를 읽어오는 부분을 보시면 왜 우리가 작고 간단한 메서드로 구현을 해야하는지 알게 됩니다.
저희는 다음과 같이 소스코드를 작성했습니다.

 
    class Program
    {
        static void Main(string[] args)
        {
            string result = BuildMsg(true);
        }

        public static string BuildMsg(bool takeFirstPath)
        {
            StringBuilder msg = new StringBuilder();
            if (takeFirstPath)
            {
                msg.Append("A problem occurred.");
                msg.Append("\nThis is a problem.");
                msg.Append("imagine much more text");
            }
            else
            {
                msg.Append("This path is not so bad.");
                msg.Append("\nIt is only a minor inconvenience.");
                msg.Append("Add more detailed diagnostics here.");
            }
            return msg.ToString();
        }

        private static string SecondPath()
        {
            throw new NotImplementedException();
        }

        private static string FirstPath()
        {
            throw new NotImplementedException();
        }

        public static string BuildMsg2(bool takeFirstPath)
        {
            if (takeFirstPath)
            {
                return FirstPath();
            }
            else
            {
                return SecondPath();
            }
        }
    }


위 소스코드의 IL을 IL 디어셈블러로 확인해보면 다음과 같이 메서드 단위로 떨어지는 것을 볼 수 있습니다.























함수 하나를 클릭해서 상세히 살펴보겠습니다.


함수 하나를 호출할 경우 해당 메서드 안에 있는 코드 모두를 로드하게 됩니다. 그렇다면 메서드 안에서 다른 메서드를 호출하는 경우는 어떨까요?
아래 처럼 call이라는 코드를 보실 수 있습니다. 분개부분에서 필요한 메서드만 다시 호출하게 되는거죠. 결국 사용하지 않는 리소스를 로드하지 않아 JIT컴파일러는 보다 효율적으로 실행 될 수 있겠죠? 바로 이 점때문에 저희는 작고 간단한 메서드 단위로 코딩을 해야하는 이유입니다.


 


Posted by 사나에
검도/검도일지2011. 4. 5. 22:26
가벼운 마음으로 도장을 들어섰으나 운동때 몸은 왜이리 무거운가?
오른쪽 팔이 내맘대로 움직이질 않는다 OTL...
깃털을 생각하며 깃털처럼 펄펄 날고 싶었으나 쉽지않다...
내 페이스를 조절하는 연습이 필요해보인다.
오늘은 제대하고 복귀한 은우를 만나서 반갑고 좋았다. 벌써 2년 ㅋㅋ 세월 참 빠르다.
우리 영식이 학생도 빨리 도장 복귀하면 좋을텐데 ㅋㅋ

오늘 검도 반성.
  1. 기초체력 키우기
  2. 거리 조절하자. 성보오빠랑 대련할때 단 한번도 거리를 못맞췄다. 왜 그랬을까?? 뭐가 문제인건가??
  3. 급하게 하지말자. 조급해지면 거리도 검도 제대로 나오지 못한다.
  4. 한번을 치더라도 크고 정확하게 연습하자.

알면서도 안되는게 검도 더 열심히 수련하자. 내일은 스터디로 쉬고~~
목요일에 고고씽!!

즐겁다 즐겁다 즐겁다!!


Posted by 사나에
검도/검도일지2011. 4. 4. 22:56

제대로 죽도를 손에 잡기까지 너무 오랜시간이 걸렸다.
몇번의 수술과 체력저하로 인한 몸상태 저질로 -.-  운동을 시작하지 못했다.
다시 시작해야지 맘을 먹고도 몇번 도장에 못나가고 질질 끌다 여기까지 왔다. 오늘 드디어 초심으로 돌아가 죽도를 새로 잡았다.
내스스로에게 최선을 다했다. 물론 죽도엔 검력도 없고 대련은 엉망이었지만 이제... 다시 시작이다.
  • 거리를 맞춰 들어갈 것. 선혁을 넘어서 들어가면 유효타격이 되지않는다.
  • 타격시에는 죽도를 쮜어 짜듯이 잡아라.
  • 머리든 손목이든 치고 난뒤에 존심을 가지고 앞으로 나아가라. 또한 팔을 구부리지 말아라.
  • 힘있는 중단 자세를 취하라.

오늘 운동을 하면서 느낀 몇가지를 적어본다. 다시금 생각하고 또 생각하고 고치도록 노력해야징.
검도는 백지장을 한장한장 쌓는 일이라고 하였다. 하루하루 쌓다가도 쉬면 그 백지장들이 다 날아가버린다.
쉬다가 운동하면 다시 한장한장 쌓는거라고 꾸준히 하는게 정답이다.
쉽지는 않지만 다시금 시작해보련다. 매일은 못하더라고 일주일에 3회 이상은 꼭!!! 꼭!! 꼭!

Posted by 사나에

What is GeHashCode()?


  • 해시테이블이나 Dictionary 같은 해시코드를 기반으로 하는 collection에 Key로 활용할 타입을 정의하는 경우를 제외하고는 GetHashCode() 메서드를 재정의하지 않는 것이 좋다.
  • GetHashCode() 메서드를 이용하여 collection들의 해시코드를 획득할 수 있다.
  • Regerence 타입에 대해서는 비효율적이긴 하지만 동작한다.
  • Value타입에 대해서는 제대로 동작하지 않는 경우도 있다. ==> 단, immutable타입에 대해서만 정상적으로 동작한다. 물론 비효율적으로 동작.
  • 해시 기반의 컨테이너들은 검색의 최적화를 위해서 해시 코드를 이용하며 모든 객체는 해시 코드라고 불리는 integer 값을 생성한다.
  • 닷넷에서는 모든 객체들이 해시 코드를 가지고 있으며 이값은 System.Object.GetHashCode()에 의해서 반환된다.
  • GetHashCode()를 재정희하기 위한 3가지 규칙
    1. 만일 두 개의 객체가 동일하다면 두 객체는 동일한 해시 코드를 생성해야 한다. 하지만 해시 코드를 이용하여 특정 컨테이너 내에서 다수의 객체들을 찾아내는 데 사용할 수 없다.
    2. 특정 객체 a에 대해서 a.GetHashCode()의 반환값은 객체의 인스턴스가 생성된 이후에는 변하지 않아야 한다. 어떠한 시점에 a 객체의 GetHashCode()를 호출하더라도 반환되는 값은 항상 동일해야 한다. 해시 기반 컨테이너 내에서는 객체를 찾을 때 해시 코드를 이용하여 저장 공간을 검색하기 때문에 이 값이 변경되면 객체가 저장된 올바른 저장 공간을 찾지 못할 수 있다.
    3. 해시 함수는 모든 입력 값에 대해서 integer의 표현범위 내에서 골고루 잘 분산되어야 한다. 이러한 특성이 해시기반 컨테이너의 수행 성능에 영향을 미친다.
  • 실제로 Object.GetHashCode()는 System.Object 클래스에 존재하는 내부값을 반환하는 역할만 한다.
  • 이 값은 System.Object의 객체 생성자에 의해서 만들어지고 1부터 시작하여 매 객체 생성 요청때마다 1씩 증가되는 값을 생성하도록 구성하여 이 값을 반환할 뿐이다.



http://msdn.microsoft.com/ko-kr/library/system.object.gethashcode.aspx
http://msdn.microsoft.com/ko-kr/library/system.object.aspx

Posted by 사나에
개발 이야기/www.Web2011. 3. 27. 20:13

RAZOR - 웹메트릭스

{CODE PARTY} 1차 세미나 - ASP.NET Razor (1/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (2/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (3/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (4/5)




{CODE PARTY} 1차 세미나 - ASP.NET Razor (5/5)



Posted by 사나에