■ Parallel 클래스 : For 정적 메소드 사용하기

------------------------------------------------------------------------------------------------------------------------


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

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker