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
}
}