첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
다운로드

▶ Program.cs

using System;
using System.Threading.Tasks;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 시작 시간
        /// </summary>
        private static DateTime _startTime;

        /// <summary>
        /// 종료 시간
        /// </summary>
        private static DateTime _endTime;

        /// <summary>
        /// 카운트
        /// </summary>
        private static int _count = 100000000; // 1억

        /// <summary>
        /// 동기 객체
        /// </summary>
        private static object _syncObject = new object();

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            Console.Title = "Parallel 클래스 : For 정적 메소드 사용하기";

            Console.WriteLine("FOR 루프 처리하기");

            SetStartTime();

            ProcessForLoop();

            SetEndTime();

            PrintEllapseTime();

            Console.WriteLine();

            Console.WriteLine("단순 Parallel.For 사용하기");

            SetStartTime();

            ProcessSimpleParallelFor();

            SetEndTime();

            PrintEllapseTime();

            Console.WriteLine();

            Console.WriteLine("Parallel.For 사용하기");

            SetStartTime();

            ProcessParallelFor();

            SetEndTime();

            PrintEllapseTime();
        }

        #endregion

        #region 시작 시간 설정하기 - SetStartTime()

        /// <summary>
        /// 시작 시간 설정하기
        /// </summary>
        private static void SetStartTime()
        {
            _startTime = DateTime.Now;

            Console.WriteLine("시작 시간 : " + _startTime);
        }

        #endregion
        #region 종료 시간 설정하기 - SetEndTime()

        /// <summary>
        /// 종료 시간 설정하기
        /// </summary>
        private static void SetEndTime()
        {
            _endTime = DateTime.Now;

            Console.WriteLine("종료 시간 : " + _endTime);
        }

        #endregion
        #region 경과 시간 출력하기 - PrintEllapseTime()

        /// <summary>
        /// 경과 시간 출력하기
        /// </summary>
        private static void PrintEllapseTime()
        {
            Console.WriteLine("경과 시간 : " + (_endTime - _startTime));
        }

        #endregion

        #region FOR 루프 처리하기 - ProcessForLoop()

        /// <summary>
        /// FOR 루프 처리하기
        /// </summary>
        private static void ProcessForLoop()
        {
            double summary = 0.0;
            double step    = 1.0 / _count;

            for(var i = 0; i < _count; i++)
            {
                double x = (i + 0.5) * step;

                summary += 4.0 / (1.0 + x * x); 
            }

            Console.WriteLine("연산 결과 : " + summary);
        }

        #endregion
        #region 단순 Parallel.For문 처리하기 - ProcessSimpleParallelFor()

        /// <summary>
        /// 단순 Parallel.For문 처리하기
        /// </summary>
        private static void ProcessSimpleParallelFor()
        {
            double summary = 0.0;
            double step    = 1.0 / _count;

            Parallel.For
            (
                0,
                _count,
                i =>
                {
                    double x = (i + 0.5) * step;
                    double y = 4.0 / (1.0 + x * x);

                    lock(_syncObject) 
                    {
                        summary += y;
                    }
                }
            );

            Console.WriteLine("연산 결과 : " + summary);
        }

        #endregion
        #region Parallel.For문 처리하기 - ProcessParallelFor()

        /// <summary>
        /// Parallel.For문 처리하기
        /// </summary>
        private static void ProcessParallelFor()
        {
            double summary = 0.0;
            double step    = 1.0 / _count; 

            Parallel.For
            (
                0,
                _count,
                () => 0.0,
                (i, state, local) => {

                    double x = (i + 0.5) * step;

                    return local + 4.0 / (1.0 + x * x);
                },
                local => {

                    lock(_syncObject)
                    {
                        summary += local;
                    }
                }
            );

            Console.WriteLine("연산 결과 : " + summary);
        }

        #endregion
    }
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker

댓글을 달아 주세요