반응형

Golang 속도 측정 방법

 

코드

startTime := time.Now()

elapsedTime := time.Since(startTime)
fmt.Printf("실행시간: %s\n", elapsedTime)
반응형

'Golang > Let's Go' 카테고리의 다른 글

Go 변수와 상수  (0) 2023.10.01
Go 에러로 인한 서버 다운 막는 방법  (0) 2023.08.28
Go smtp SendMail 기능 구현(기본 구현과 개선)  (0) 2023.08.24
Zero allocation  (0) 2023.08.10
Go 패키지 외부 공개 여부  (0) 2023.08.09
반응형

Go smtp SendMail 기능 구현

 

사용한 메일 서버

- gmail 서버

 

사용한 라이브러리

- "net/smtp"

 

구현할 때 주의할 점

- 메일 여러개를(현재 테스트 해봤을 때는 10개까지) 보냈을 때 gmail 서버에서 스팸으로 인식해서 걸러버리기 때문에 발송하는 메세지 부분에서 특정 값들을 넣어 스팸으로 인식하지 못하도록 해야합니다.

 

 

구현

import (
	"net/smtp"
)

func SendMail() {
    auth := smtp.PlainAuth("", "", "", "smtp.gmail.com")
    from := ""
    to := []string{""}

    // 메시지 작성
    headerSubject := "Subject: [제목] 메일 테스트 발송입니다\r\n"
    headerBlank := "\r\n"
    body := "[본문] 메일 테스트 발송"
    msg := []byte(headerSubject + headerBlank + body)

    // 메일 보내기
    err := smtp.SendMail("smtp.gmail.com:587", auth, from, to, msg)
    if err != nil {
        log.Fatalf("Failed to send the email: %v", err)
    }
    
    return
}

 

기본 구현의 문제점

- 여러 메일을 한 번에 보내도록 for문을 작성하여 구현하면 스팸으로 인식하는 문제와 처리 속도가 느려진다는 문제가 있습니다. 1개의 메일을 처리하고 return 하는데 2초 이상이 걸립니다. 만약 10개 이상이면 20초가 아닌 더 오래 걸립니다.

 

 

개선

func SendMail() {
	auth := smtp.PlainAuth("", sms.GetEmailInfo(), sms.GetEmailPasswordInfo(), sms.GetEmailHostInfo())
	from := sms.GetEmailInfo()
	to := []string{sms.GetEmailInfo()} // 아직 따로 DB에서 데이터를 가져올 것이 없어 개발자 메일을 가져왔습니다.

	// 메시지 작성
	headerSubject := "Subject: [제목] 메일 테스트 발송입니다\r\n"
	headerBlank := "\r\n"
	body := "[본문] 메일 테스트 발송"
	//msg := []byte(headerSubject + headerBlank + body)

	// 메일 보내기
	var wg sync.WaitGroup
	for _, t := range to {
		wg.Add(1)
		go func(t string) {
			defer wg.Done()
			go smtp.SendMail("smtp.gmail.com:587", auth, from, to, []byte(fmt.Sprintf(headerSubject+headerBlank+body, t)))
		}(t)
	}

	wg.Wait()
}

 

개선 사항

- go의 장점인 go routine을 사용하여 비동기 방식으로 코드를 짜서 smtp.SendMail() 함수가 끝날 때까지 매번 기달리지 않고 for문을 돌고 SendMail() 함수를 끝냅니다. 기존에 걸리던 2초를 밀리세컨드로 줄였고, 대량으로 메일을 보내도 함수 실행에서 종료까지의 속도는 밀리세컨드로 유지됩니다.

반응형

'Golang > Let's Go' 카테고리의 다른 글

Go 에러로 인한 서버 다운 막는 방법  (0) 2023.08.28
Golang 속도 측정 방법  (0) 2023.08.28
Zero allocation  (0) 2023.08.10
Go 패키지 외부 공개 여부  (0) 2023.08.09
go work 실행 함수  (0) 2023.08.09
반응형
반응형

Zero allocation

 

Zero allocation이란?

"Zero allocation"은 프로그래밍에서 메모리 할당과 관련된 개념입니다. 이는 메모리 할당 없이 작업을 수행하거나 최소한의 메모리 할당만을 사용하여 높은 성능을 달성하기 위한 기술이나 접근 방식을 가리킵니다. 주로 고성능 및 실시간 시스템에서 중요한 역할을 합니다.

일반적으로 프로그램에서 메모리를 할당하거나 해제하는 작업은 비용이 많이 드는 작업 중 하나입니다. 메모리 할당은 시스템 호출이나 내부적인 자료구조 조작 등을 통해 이루어지며, 이로 인해 프로그램 실행 속도가 느려질 수 있습니다. 또한 메모리 할당을 빈번하게 하면 메모리 단편화가 발생할 수 있어 메모리 사용 효율도 저하될 수 있습니다.

 


원칙

사전 할당 (Preallocation): 프로그램 시작 시 미리 필요한 메모리를 할당하고, 이후에는 필요한 데이터를 재사용하거나 재할당하지 않는다. 이렇게 하면 메모리 할당 및 해제에 드는 오버헤드를 줄일 수 있습니다.
재활용 (Reusing): 이전에 할당한 메모리를 재활용하여 새로운 데이터를 저장하는 방식을 채택합니다. 즉, 메모리를 계속해서 재할당하지 않고 이미 할당된 메모리를 사용합니다.
스택 사용 (Stack Allocation): 가능한 경우 스택 메모리를 활용하여 메모리를 할당합니다. 스택 메모리 할당은 힙 메모리 할당보다 훨씬 빠르며, 스택 프레임 내에서 지역 변수 등을 할당하는 방식입니다.
불변성 (Immutability): 데이터를 불변 객체로 다루는 것을 선호합니다. 이로 인해 데이터의 복사본을 만들거나 변경할 필요가 없어지며, 메모리 할당을 줄일 수 있습니다.
객체 풀 (Object Pooling): 미리 할당한 객체 풀에서 객체를 가져와 사용하고 반환하는 방식으로 메모리 할당을 줄일 수 있습니다.
"Zero allocation"은 주로 고성능 게임 엔진, 실시간 그래픽 처리, 실시간 통신 시스템 등에서 사용되며, 높은 성능과 메모리 효율성을 유지하는 데 도움을 줍니다.

반응형
반응형
반응형

Go 패키지 외부 공개 여부

 

Go 패키지 외부 공개 여부

패키지에서 외부로 공개할 함수는 대문자로 시작하여 작성하며, 외부로 공개하지 않을 때는 소문자로 시작하여 작성해주면 됩니다.

반응형

'Golang > Let's Go' 카테고리의 다른 글

Go 에러로 인한 서버 다운 막는 방법  (0) 2023.08.28
Golang 속도 측정 방법  (0) 2023.08.28
Go smtp SendMail 기능 구현(기본 구현과 개선)  (0) 2023.08.24
Zero allocation  (0) 2023.08.10
go work 실행 함수  (0) 2023.08.09
반응형
반응형

 

 

go work 실행 함수

 

Code

> go work init
> go work use project-one
> go work use project-two

 

Troubleshooting

만약 go.work 파일을 만든 후 하면 go build 할 때 “current directory is contained in a module that is not one of the workspace modules listed in go.work. You can add the module to the workspace using:” 에러가 발생할 수 있습니다.

그럼 지우고 다시 go work init을 실행해준 후 다시 작업을 해주면 작동합니다.

또 다른 문제로 숫자 8을 추가 하려고 하는데 추가가 안되는 문제가 발생했습니다.

문제는 go 파일이 8 폴더 아래에 있는게 아니라 ./8/Lottery이 아래에 있어서 추가를 하지 않았던거 였습니다. 폴더 directory를 제대로 하고 use 함수를 사용하니 해결되었습니다.

 

반응형

'Golang > Let's Go' 카테고리의 다른 글

Go 에러로 인한 서버 다운 막는 방법  (0) 2023.08.28
Golang 속도 측정 방법  (0) 2023.08.28
Go smtp SendMail 기능 구현(기본 구현과 개선)  (0) 2023.08.24
Zero allocation  (0) 2023.08.10
Go 패키지 외부 공개 여부  (0) 2023.08.09
반응형
반응형

./room.go:39:6: main redeclared in this block

 

 

해결

하나의 폴더 아래 main이라는 함수를 2개를 사용해서 발생한 에러입니다.

main 함수를 하나만 가지도록 이름을 수정해줍니다.

반응형
반응형
반응형

package command-line-arguments is not a main package

 

해결

main package에서만 go run이 실행되는거 같습니다. 

반응형
반응형

package is not in GOROOT

* Mac

* vscode

* Golang 1.20

상황

main.go에서 다른 모듈을 호출해서 사용할려고 다른 패키지 파일을 호출했는데 발생한 에러입니다.

 

해결

go는 다른 모듈을 호출하고 사용할려면 go mod init을 통해 모듈 관리 파일을 생성해줘야 합니다.

생성 후 실행하니 실행되었습니다.

반응형

+ Recent posts