ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Golang 실행 시간 측정
    Golang 2022. 7. 28. 16:34
    프로그램의 성능을 확인하기 위해 실행시간을 측정해야 할 때가 있다. 이번에는 Golang에서 코드가 실행되는데 걸리는 시간을 측정하는 방법을 알아보자.

    time 패키지 사용

    import (
        "time"
    )
    • time 패키지는 시간을 표현하기 위한 Time 타입을 제공한다. 나노초 단위의 정밀도를 가진 구조체인데 세가지의 프로퍼티를 가진다
    type Time struct {
        wall uint64
        ext int64
        loc *Location
    }
    • 위 세가지의 프로퍼티의 정확한 쓰임새를 이해하지는 못했지만 time 패키지를 사용하는데는 아무런 문제가 없다.

    시간 측정

    • time 패키지는 많은 기능을 제공해주지만 실행 시간 측정을 위해서는 다음 2가지만 알면 된다
      • `time.Now()`, `time.Since()`
      • `time.Now()` 부터 `time.Since()`까지의 시간을 측정할 수 있다.
    • 예시
    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
        // 여기서 부터 시간 측정 시작
        start := time.Now()
    
        for i := 1; i <= 15; i++ {
            time.Sleep(1)
        }
    
        // end 까지 걸린 시간을 측정
        end := time.Since(start)
        fmt.Printf("실행시간 : %s\n", end)
    }

    Goroutine 시간 측정

    • goroutine을 사용하면 위의 방법으로 시간을 측정할 수 없다.
      • 고루틴 함수가 진행되는 도중에 end가 측정되버리기 때문

    sync 패키지 사용

    import (
        "time"
        "sync"
    )
    • sync 패키지를 사용하면 고루틴이 끝날때 까지 기다린 후 시간을 측정할 수 있다.
      • `sync.WaitGroup`를 사용
      • 고루틴이 시작 될 때 `wg.Add(1)`로 WaitGroup에 진행중인 고루틴 갯수를 추가하고 고루틴이 끝날때 마다 `wg.Done()`로 WaitGroup에 진행중인 고루틴 갯수를 하나씩 줄인다. `wg.Wait()`를 이용해 WaitGroup에서 모든 고루틴이 끝날때 까지 기다렸다가 시간측정을 한다.
    • 예시
    package main
    
    import (
    	"fmt"
    	"time"
    	"sync"
    )
    
    // WaitGroup
    var wg sync.WaitGroup
    
    func main() {
    	// 여기서 부터 시간 측정 시작
    	start := time.Now()
        
        // wg.Add : WaitGroup 에 대기 중인 고루틴 갯수 추가
    	for i := 0; i < 10; i++ {
    		wg.Add(1)
    		go func(idx int) {
    			// 고루틴 함수가 한번 끝날 때 마다 WaitGroup 에 대기 중인 고루틴 갯수를 하나씩 뺀다.
    			defer wg.Done()
    			for j := 0; j <= 100; j++ {
    				fmt.Println(j)
    			}
    		}()
    	}
    	// 모든 고루틴이 종료될 때까지 기다렸다가
    	wg.Wait()   
    	// end 까지 걸린 시간을 측정
    	end := time.Since(start)
    	fmt.Printf("실행시간 : %s\n", end)
    }

    'Golang' 카테고리의 다른 글

    Go 함수 파라미터 유동적으로 사용하기  (0) 2023.09.08
    Command Line Argument  (0) 2022.07.25
    고루틴(goroutine)  (0) 2022.07.12
Designed by Tistory.