저는 최근 암호화폐 거래소 수집기 작업을 시작했습니다. 기본적으로 저는 다양한 거래소에 요청을 보내고 환율을 비교합니다. 이 작업은 가능한 한 빨리 이루어져야 합니다. 이 게시물에서는 성능을 크게 향상시키기 위해 제가 적용한 몇 가지 조정 사항을 보여 드리겠습니다.
그러나 나는 전문가가 아니며(특히 전문가) 개인 프로젝트에서 찾은 결과를 공유하고 있다는 점을 명심하십시오.
이러한 개선 사항은 런타임이 가장 크게 개선된 순서대로 이루어졌습니다.
모든 Go 프로그램에서 고루틴은 속도를 위해 필수적입니다. 제가 이룬 가장 큰 향상은 요청을 동시에 보내는 것이었습니다. 12개의 서로 다른 교환을 수행해야 하기 때문에 이러한 요청을 동시에 보내면 런타임이 약 24초에서 단 ~3초로 단축되었습니다.
고루틴은 놀랍고 사용하기 매우 쉽습니다. 가능하면 이를 포함해야 합니다. 하지만 항상 데이터 경합을 조심하세요
encoding/json을 github.com/json-iterator/go.jsoniter로 교체했습니다. 표준 라이브러리를 즉시 대체할 수 있는 빠른 JSON 처리 라이브러리이므로 코드를 변경할 필요가 없었습니다. , 라이브러리 스위치일 뿐입니다.
벤치마크 결과
성능 향상을 측정하기 위해 인코딩/json과 jsoniter를 비교하는 몇 가지 벤치마크를 실행했습니다. 결과 요약은 다음과 같습니다.
goos: linux goarch: amd64 pkg: apiSpeedImprove cpu: AMD Ryzen 5 7640U w/ Radeon 760M Graphics BenchmarkEncodingJSON-12 140383 7381 ns/op BenchmarkJSONIter-12 974605 1217 ns/op PASS ok apiSpeedImprove 3.216s
따라서 jsoniter는 표준 라이브러리보다 약 6배 빠릅니다.
요청마다 새 핸들러를 만드는 대신 HTTP 핸들러를 재사용하기 시작했습니다. 핸들러를 한 번 설정하고 재사용함으로써 각 요청에 대해 새 핸들러를 만드는 오버헤드를 줄였습니다.
벤치마크 결과
다음은 재사용된 핸들러와 각 요청에 대한 새 핸들러 생성을 비교한 벤치마크 결과입니다.
goos: linux goarch: amd64 pkg: apiSpeedImprove/httpReuse cpu: AMD Ryzen 5 7640U w/ Radeon 760M Graphics BenchmarkReusedHandler-12 2179 505189 ns/op BenchmarkNewHandlerPerRequest-12 2341 507525 ns/op PASS ok apiSpeedImprove/httpReuse 7.270s
HTTP 핸들러를 재사용하면 각 요청에 대해 새 핸들러를 만드는 것보다 성능이 약간 향상됩니다.
이러한 조정을 통해 모든 정보를 수집하는 데 걸리는 시간을 처음 24초에서 약 2초로 단축할 수 있었습니다. 꽤 확실한 개선이 이루어졌습니다!
제 벤치마크 코드에 관심이 있으시면 여기에서 확인하실 수 있습니다.
이 게시물이 마음에 들었고 내 작업을 지원하고 싶다면 여기에서 기부할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3