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

 
Hoons-Attraction of Small Functions
View more presentations from pouoq12.

아시다시피 우리가 작성하는 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 사나에