2017-03-25 2 views
0

나는 코드 반복을 허용하지 않습니다. 그러나 나는 실행 시간을 측정하고자하는 모든 기능에서 반복해야하는 상황이 있으며 아무 것도 할 수 없습니다. 예를 들어, 함수 : 골란 코드 삽입/대체

func someFunc() { 
    start_time := time.Now() 
    defer fmt.Println("Execution time: %v", time.Now().Sub(start_time)) 
    <... doing some bussiness ...> 
} 

는 지금은 모든 기능이이 첫 번째 스트로크를 반복해야합니다 (원래 그들은 때문에 함수 이름을 호출하는 더 복잡합니다). 그래서 시간을 측정하는 기능을 만들 수 없습니다. 왜냐하면 시간을 측정하는 기능을 사용해야하기 때문입니다. 두 번째 스트로크에도 함수를 만들 수는 없으므로 원본에서 Println의 함수 이름을 호출하므로 결과 이름이 필요한 함수가되지 않습니다. 일부 라벨 또는 템플릿으로이 코드를 삽입 할 수있는 방법은 다음과 같이 예를 들어, 거기 :

func someFunc() { 
//go-insert measuretime.tmpl 
    <... doing some bussiness ...> 
} 

그리고 measuretime.tmpl은 다음과 같습니다

start_time := time.Now() 
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time)) 

답변

1

이 트릭은 도움이 될 수 있습니다 : 전화를 연기 시작 시간을 감싸는 함수를 반환하는 함수.

func elapsed() func() { 
    start := time.Now() 
    return func() { 
     fmt.Println("Duration was", time.Since(start)) 
    } 
} 

전화는 다음과 같이 :

defer elapsed()() 

Have a play

이 벤치마킹은 이동의 성능을 측정하는 일반적인 방법이라고 말했다 가졌어요. how to write benchmarks in Go을 참조하십시오.

+0

예, 작동합니다. 정확히 내가 원하는 것처럼 아니지만, 여전히. 그리고 여전히 코드 삽입에 관심이있어 내부 함수 호출을 피할 수 있습니다. 이 경우 return func()에서 이름이없는 함수입니다. –