동작시간을 구하는 간단한 프로그램을 만들어 보기 위해서 약수를 구하는 프로그램을 만들었습니다. 기본적으로 "Math" 클래스에 수학관련 메소드들이 존재합니다. 가령 절대값 같은 경우 "Math.Abs"라고 사용하면 되는대 약수를 구하는 메소드는 없습니다. 그래서 약수를 구하는 프로그램을 만들어 시간을 측정해 보도록 하겠습니다. (그런대 소스의 설명은 약수구하기를 바탕으로 설명합니다. 이는 동작시간을 구하는 방법이 간단하기 때문입니다.)
Visual Studio 2008에서 만들어 졌으며 .NET Framework 2.0 이상에서 동작합니다.
public string Divisor(int diviValue) { int divCounter = 0; // 나눈 갯수를 샘 int fcnt1 = 1; // for문에서 사용 int diviResult = 0; // 나눈 나머지를 int형태로 저장 string divsResult = ""; // 나눈 나머지를 string형태로 저장 string resultStr = ""; // 반환할 최종 값을 저장 // diviValue = 입력된 정수 Stopwatch sw = new Stopwatch(); sw.Start(); for (fcnt1 = 1, divCounter = 0 ; fcnt1 <= diviValue; fcnt1++) { diviResult = diviValue % fcnt1; if (diviResult == 0) { if (divCounter > 0) { divsResult = divsResult + string.Concat(", "); } divsResult = divsResult + string.Concat(fcnt1); divCounter++; } } sw.Stop(); resultStr = "Divisor of " + diviValue + " = " + divsResult + "\r\n" + "Count : " + divCounter + "\r\n" + "Process time : " + sw.Elapsed.ToString(); return resultStr; }
간단한 방식으로 돌아가며 소스파일에 주석이 달려 있습니다. 테스트로 24와 1234567890값을 넣고 실행해 보았습니다.
[그림 1. 24]
[그림 2. 1234567890]
소스를 보면 13번줄에 for문으로 1에서 입력값까지 증가하며 돌아가기 때문에 1234567890값에 경우 총 12억3천만번 for문을 돌게 됩니다. 때문에 1234567890의 약수를 구하는경우 32.6초가 소요됬습니다. 여기서 소용시간을 기록하는건 10, 11, 29, 33번 라인에서 합니다.
using System.Diagnostics; // using문으로 Diagnostics네임스페이스를 선언해야 Stopwatch클래스를 이용할 수 있습니다. Stopwatch sw = new Stopwatch(); sw.Start(); >> 시간을 측정할 코드 << sw.Stop(); sw.Elapsed
Stopwatch는 측정한 시간을 반환하는대 세가지 형식은 Elapsed, ElapsedMilliseconds, ElapsedTicks 입니다. Elapsed는 첫번째 소스에 33번 라인에서 사용했는대 그림 2에 결과와 같이 "시:분:초.0점단위"로 나오게 됩니다. ElapsedMilliseconds는 Millisecond단위이기 때문에 그림 1과 같은경우는 0이 나오는대 이는 밀리세컨드인 .000 값이 0이기 때문입니다. 그 뒤에 0194값은 밀리세컨드보다 적기 때문에 무시 됩니다. 그림 2와 같은경우 32672가 나오게 됩니다. ElapsedTicks는 타이머의 틱 수가 나오게 됩니다. 틱수가 나오기 때문에 값이 들쑥날쑥 합니다. 그리고 측정된 값은 따로 다른곳에 저장하지 않아도 기억을 하고 있으며 "sw.Elapsed"를 사용하여 측정값을 출력합니다. 1
- 틱(Tick)이란 1/1000 sec으로 좀더 보기쉽게 단위를 환산하면 1 msec이 됩니다. 그런대 C#에서의 Tick은 msec단위보단 시간간격 순간을 표현하는것 같습니다. (정확하게 알고계신분은 지적 부탁드립니다.) [본문으로]