찾다
백엔드 개발Golang비교 벤치마킹: 처리량이 많은 시나리오의 ILP, A*, 분기 및 바운드 알고리즘

Comparative Benchmarking: ILP, A*, and Branch and Bound Algorithms in High-Throughput Scenarios

이번 블로그 게시물에서는 최근 개인 프로젝트에 사용된 세 가지 알고리즘인 ILP(정수 선형 계획법) 알고리즘, A* 알고리즘을 활용한 로컬 알고리즘과 Branch and Bound 알고리즘을 활용한 최적화 솔루션입니다. 모든 알고리즘은 동일한 데이터 세트를 사용하여 테스트되었으며 ILP 및 Branch and Bound 구현은 동일한 워크로드를 공유했지만 A* 구현은 성능 제약으로 인해 제한되었습니다.

면책 조항: 프로젝트의 특정 코드 세부 사항을 자세히 다루지는 않지만, 이에 대한 몇 가지 통찰력을 공유하겠습니다. 코드베이스는 공개용이 아니며, 이는 코드의 기밀성을 존중한다는 면책 조항으로 사용됩니다.

벤치마크 결과

다음은 세 가지 알고리즘 모두에 대한 벤치마크 결과입니다.

goos: linux
goarch: amd64
pkg: github.com/sosalejandro/<my-project>/<my-package>/pkg
cpu: 13th Gen Intel(R) Core(TM) i7-13700HX

BenchmarkGenerateReportILP-24                            724       1694029 ns/op       30332 B/op        181 allocs/op
BenchmarkGenerateReportILPParallel-24                   6512        187871 ns/op       34545 B/op        184 allocs/op
BenchmarkGenerateReportLocal-24                            2     851314106 ns/op    559466456 B/op   7379756 allocs/op
BenchmarkBranchGenerateReportLocal-24                 101449         12106 ns/op       29932 B/op        165 allocs/op
BenchmarkGenerateReportLocalParallel-24                    3     349605952 ns/op    559422440 B/op   7379837 allocs/op
BenchmarkBranchGenerateReportLocalParallel-24         120543         10755 ns/op       29933 B/op        165 allocs/op
PASS
coverage: 81.4% of statements
ok      github.com/sosalejandro/<my-project>/<my-package>/pkg   11.121s
</my-package></my-project></my-package></my-project>

워크로드 구성

모든 알고리즘은 동일한 데이터 세트를 사용하여 테스트되었지만 작업량(즉, 각 항목이 처리되는 횟수)은 구현마다 달랐습니다.

ILP 및 분기 및 바인딩된 구현 작업 부하:

plan := []Plan{
    {ID: "1", Times: 100},
    {ID: "2", Times: 150},
    {ID: "3", Times: 200},
    {ID: "8", Times: 50},
    {ID: "9", Times: 75},
    {ID: "10", Times: 80},
    {ID: "11", Times: 90},
    {ID: "12", Times: 85},
    {ID: "13", Times: 60},
    {ID: "14", Times: 110},
}

A* 구현 작업량:

plan := []Plan{
    {ID: "1", Times: 1},
    {ID: "2", Times: 1},
    {ID: "3", Times: 5},
    {ID: "8", Times: 5},
    {ID: "9", Times: 5},
    {ID: "10", Times: 5},
    {ID: "11", Times: 9},
    {ID: "12", Times: 5},
    {ID: "13", Times: 5},
    {ID: "14", Times: 5},
}

워크로드 분석

이러한 워크로드가 벤치마크 결과에 미치는 영향을 이해하기 위해 각 구현에 대한 총 반복 횟수(즉, Times 값의 합)를 계산해 보겠습니다.

총 반복:

  • ILP 및 분기 및 바인딩 구현:
  100 + 150 + 200 + 50 + 75 + 80 + 90 + 85 + 60 + 110 = 1000
  • A* 구현:
  1 + 1 + 5 + 5 + 5 + 5 + 9 + 5 + 5 + 5 = 46

작업량 비율:

ILP Iterations / A* Iterations = 1000 / 46 ≈ 21.74

이는 ILP와 Branch and Bound 구현이 A* 구현에 비해 대략 21.74배 더 많은 반복을 처리한다는 의미입니다.

성능 비교

워크로드 차이에 따른 벤치마크 결과를 분석해 보겠습니다.

Benchmark Runs ns/op B/op allocs/op Total Time (ns)
BenchmarkGenerateReportILP-24 724 1,694,029 30,332 181 ≈ 1,225,836,996
BenchmarkGenerateReportILPParallel-24 6,512 187,871 34,545 184 ≈ 1,223,607,552
BenchmarkBranchGenerateReportLocal-24 101,449 12,106 29,932 165 ≈ 1,224,505,394
BenchmarkGenerateReportLocal-24 2 851,314,106 559,466,456 7,379,756 ≈ 1,702,628,212
BenchmarkGenerateReportLocalParallel-24 3 349,605,952 559,422,440 7,379,837 ≈ 1,048,817,856
BenchmarkBranchGenerateReportLocalParallel-24 120,543 10,755 29,933 165 ≈ 1,295,219,065

관찰

  1. 작업별 실행 시간:
    • BenchmarkGenerateReportILP-24 대 BenchmarkBranchGenerateReportLocal-24:
      • 분기 및 경계ILP보다 99.29% 더 빠르며 실행 시간을 1,694,029ns/op에서 12,106ns/op로 줄입니다. .
  • BenchmarkGenerateReportILP-24 대 BenchmarkGenerateReportLocal-24:

    • ILP로컬보다 99.80% 더 빠르며 실행 시간을 851,314,106ns/op에서 1,694,029ns/op.
  • BenchmarkGenerateReportILPParallel-24 대 BenchmarkBranchGenerateReportLocalParallel-24:

    • 분기 및 바운드 병렬ILP 병렬보다 94.28% 더 빠르며 실행 시간을 187,871ns/op에서 10,755ns로 줄입니다. /op.
  • BenchmarkGenerateReportILPParallel-24 대 BenchmarkGenerateReportLocalParallel-24:

    • ILP 병렬로컬 병렬보다 99.95% 더 빠르며 실행 시간을 349,605,952ns/op에서 187,871ns/op로 줄입니다. .
  1. 메모리 할당:

    • ILP 구현: 병렬 실행 시 메모리 사용량 및 할당이 약간 증가합니다.
    • 분기 및 바운드 구현: A* 구현에 비해 메모리 사용량 및 할당이 적습니다.
    • A* 구현: 메모리 할당이 매우 높아 리소스 활용도가 비효율적입니다.
  2. 처리량:

    • ILP 병렬분기 및 경계 병렬은 작업량이 많아 약 21.74배 더 많은 반복을 처리할 수 있습니다.
    • A* 구현 처리량 문제는 반복 횟수가 현저히 적기 때문이 아니라 비효율적인 메모리 사용 및 구현 때문입니다.
다양한 작업 부하가 성능에 미치는 영향

ILP 및 Branch 알고리즘이 테스트 반복당

21.74배 더 많은 처리량을 처리한다는 점을 고려하면 이러한 워크로드 차이는 각 알고리즘의 성능과 효율성에 영향을 미칩니다.

  • ILP 및 분기 알고리즘: 더 많은 처리량을 처리하므로 더 높은 워크로드에 최적화되어 있습니다. 더 많은 작업을 처리함에도 불구하고 더 빠른 실행 시간을 유지합니다. 이는 계산적으로 효율적일 뿐만 아니라 처리량이 많은 시나리오에도 적합하다는 것을 의미합니다.

  • 로컬 알고리즘: 처리량이 적고 실행 시간이 길기 때문에 이 알고리즘은 증가된 작업 부하를 처리하는 데 효율성이 떨어집니다. ILP 또는 Branch와 동일한 처리량으로 확장하면 실행 시간이 크게 늘어나 처리량이 많은 경우에는 적합하지 않음을 나타냅니다.

워크로드가 증가하는 시나리오에서는 더 높은 처리량을 효율적으로 관리할 수 있는 능력으로 인해 ILP와 Branch가 로컬보다 성능이 뛰어납니다. 반대로, 워크로드가 줄어들면 로컬 알고리즘은 ILP 및 Branch에 더 가까운 성능을 발휘할 수 있지만 알고리즘 효율성의 근본적인 차이로 인해 여전히 지연될 가능성이 있습니다.

알고리즘 개요

각 알고리즘이 문제 해결에 어떻게 접근하는지 더 명확하게 이해할 수 있도록 해당 메커니즘과 방법론에 대한 일반적인 개요를 소개합니다.

정수 선형 계획법(ILP)

목적:

ILP는 요구사항이 선형 관계로 표현되는 수학적 모델에서 최상의 결과(예: 최대 이익 또는 최저 비용)를 찾는 데 사용되는 최적화 기술입니다. 선형 제약 조건과 선형 목적 함수로 표현 가능한 문제에 특히 효과적입니다.

일반 작업 흐름:

  1. 변수 정의:

    선택을 나타내는 의사결정 변수를 식별합니다.

  2. 목적함수:

    최대화하거나 최소화해야 하는 선형 방정식을 공식화합니다.

  3. 제약조건:

    솔루션이 충족해야 하는 선형 부등식 또는 등식을 설정합니다.

  4. 해결 방법:

    ILP 솔버를 활용하여 모든 제약조건을 만족하면서 목적함수를 최대화 또는 최소화하는 의사결정변수의 최적값을 찾습니다.

의사 코드:

goos: linux
goarch: amd64
pkg: github.com/sosalejandro/<my-project>/<my-package>/pkg
cpu: 13th Gen Intel(R) Core(TM) i7-13700HX

BenchmarkGenerateReportILP-24                            724       1694029 ns/op       30332 B/op        181 allocs/op
BenchmarkGenerateReportILPParallel-24                   6512        187871 ns/op       34545 B/op        184 allocs/op
BenchmarkGenerateReportLocal-24                            2     851314106 ns/op    559466456 B/op   7379756 allocs/op
BenchmarkBranchGenerateReportLocal-24                 101449         12106 ns/op       29932 B/op        165 allocs/op
BenchmarkGenerateReportLocalParallel-24                    3     349605952 ns/op    559422440 B/op   7379837 allocs/op
BenchmarkBranchGenerateReportLocalParallel-24         120543         10755 ns/op       29933 B/op        165 allocs/op
PASS
coverage: 81.4% of statements
ok      github.com/sosalejandro/<my-project>/<my-package>/pkg   11.121s
</my-package></my-project></my-package></my-project>

A* 알고리즘(로컬 구현)

목적:

A*는 성능과 정확성으로 잘 알려진 길 찾기 및 그래프 탐색 알고리즘입니다. 균등 비용 검색과 순수 휴리스틱 검색 기능을 결합하여 노드 간 최단 경로를 효율적으로 찾아냅니다.

일반 작업 흐름:

  1. 초기화:

    초기 노드로 시작하여 우선순위 대기열에 추가합니다.

  2. 루프:

    • 우선순위 대기열에서 예상 비용이 가장 낮은 노드를 제거합니다.
    • 목표 노드라면 종료하세요.
    • 그렇지 않으면 이웃을 탐색하여 노드를 확장하세요.
    • 각 이웃에 대해 새로운 비용을 계산하고 그에 따라 우선순위 대기열을 업데이트합니다.
  3. 해지:

    목표 노드에 도달하거나 우선순위 큐가 비어 있으면(경로가 없음을 나타냄) 알고리즘이 종료됩니다.

의사 코드:

goos: linux
goarch: amd64
pkg: github.com/sosalejandro/<my-project>/<my-package>/pkg
cpu: 13th Gen Intel(R) Core(TM) i7-13700HX

BenchmarkGenerateReportILP-24                            724       1694029 ns/op       30332 B/op        181 allocs/op
BenchmarkGenerateReportILPParallel-24                   6512        187871 ns/op       34545 B/op        184 allocs/op
BenchmarkGenerateReportLocal-24                            2     851314106 ns/op    559466456 B/op   7379756 allocs/op
BenchmarkBranchGenerateReportLocal-24                 101449         12106 ns/op       29932 B/op        165 allocs/op
BenchmarkGenerateReportLocalParallel-24                    3     349605952 ns/op    559422440 B/op   7379837 allocs/op
BenchmarkBranchGenerateReportLocalParallel-24         120543         10755 ns/op       29933 B/op        165 allocs/op
PASS
coverage: 81.4% of statements
ok      github.com/sosalejandro/<my-project>/<my-package>/pkg   11.121s
</my-package></my-project></my-package></my-project>

분기 및 바운드 알고리즘

목적:

Branch and Bound는 솔루션 공간을 체계적으로 탐색하는 최적화 알고리즘입니다. 문제를 더 작은 하위 문제로 나누고(분기) 경계를 사용하여 현재 최선의 문제(경계)보다 더 나은 솔루션을 생성할 수 없는 하위 문제를 제거합니다.

일반 작업 흐름:

  1. 초기화:

    초기 솔루션부터 시작하여 가장 잘 알려진 솔루션을 설정하세요.

  2. 분기:

    각 노드에서 문제를 더 작은 하위 문제로 나눕니다.

  3. 경계:

    각 분기에서 가능한 최상의 솔루션에 대한 낙관적 추정치(상한)를 계산합니다.

  4. 가지치기:

    상한이 가장 잘 알려진 솔루션보다 나쁜 분기는 삭제하세요.

  5. 검색:

    깊이 우선 또는 최고 우선 검색을 사용하여 나머지 분기를 재귀적으로 탐색합니다.

  6. 해지:

    모든 가지를 정리하거나 탐색한 경우 가장 잘 알려진 솔루션이 최적입니다.

의사 코드:

goos: linux
goarch: amd64
pkg: github.com/sosalejandro/<my-project>/<my-package>/pkg
cpu: 13th Gen Intel(R) Core(TM) i7-13700HX

BenchmarkGenerateReportILP-24                            724       1694029 ns/op       30332 B/op        181 allocs/op
BenchmarkGenerateReportILPParallel-24                   6512        187871 ns/op       34545 B/op        184 allocs/op
BenchmarkGenerateReportLocal-24                            2     851314106 ns/op    559466456 B/op   7379756 allocs/op
BenchmarkBranchGenerateReportLocal-24                 101449         12106 ns/op       29932 B/op        165 allocs/op
BenchmarkGenerateReportLocalParallel-24                    3     349605952 ns/op    559422440 B/op   7379837 allocs/op
BenchmarkBranchGenerateReportLocalParallel-24         120543         10755 ns/op       29933 B/op        165 allocs/op
PASS
coverage: 81.4% of statements
ok      github.com/sosalejandro/<my-project>/<my-package>/pkg   11.121s
</my-package></my-project></my-package></my-project>

비교 분석

Feature ILP Implementation Local (A*) Implementation Branch and Bound Implementation
Optimization Approach Formulates the problem as a set of linear equations and inequalities to find the optimal solution. Searches through possible states using heuristics to find the most promising path to the goal. Systematically explores and prunes the solution space to find optimal solutions efficiently.
Scalability Handles large-scale problems efficiently by leveraging optimized solvers. Performance can degrade with increasing problem size due to the exhaustive nature of state exploration. Efficient for combinatorial problems, with pruning reducing the search space significantly.
Development Time Faster implementation as it relies on existing ILP solvers and libraries. Requires more time to implement, especially when dealing with complex state management and heuristics. Moderate development time, balancing complexity and optimization benefits.
Flexibility Highly adaptable to various linear optimization problems with clear constraints and objectives. Best suited for problems where pathfinding to a goal is essential, with heuristic guidance. Effective for a wide range of optimization problems, especially combinatorial ones.
Performance Demonstrates superior performance in handling a higher number of iterations with optimized memory usage. While effective for certain scenarios, struggles with high memory allocations and longer execution times under heavy workloads. Shows significant performance improvements over ILP and A* with optimized memory usage and faster execution times.
Developer Experience Improves developer experience by reducing the need for extensive coding and optimization efforts. May require significant debugging and optimization to achieve comparable performance levels. Balances performance with manageable development effort, leveraging existing strategies for optimization.
Integration Currently integrates a C ILP module with Golang, facilitating efficient computation despite cross-language usage. Fully implemented within Golang, but may face limitations in performance and scalability without optimizations. Implemented in Golang, avoiding cross-language integration complexities and enhancing performance.

서버 성능에 미치는 영향

  • 확장성:

    • 분기 및 바운드 구현은 뛰어난 확장성을 보여주며 대기 시간을 줄이면서 많은 수의 동시 요청을 효율적으로 처리합니다.
    • ILP 병렬 구현 역시 뛰어난 확장성을 보여주며 대기 시간을 줄이면서 많은 수의 동시 요청을 효율적으로 처리합니다.
    • A* 구현은 성능 제한으로 인해 고부하 환경에 적합하지 않습니다.
  • 자원 활용도:

    • 분기 및 바운드 구현 낮은 메모리 소비와 빠른 실행 시간으로 리소스를 효율적으로 활용합니다.
    • ILP 병렬은 멀티 코어 CPU를 효과적으로 활용하여 관리 가능한 메모리 소비로 높은 처리량을 제공합니다.
    • A* 구현은 과도한 메모리를 소비하여 잠재적으로 리소스 고갈을 초래할 수 있습니다.

워크로드가 성능에 미치는 영향

워크로드 차이는 알고리즘 성능에 영향을 미칩니다.

  • 분기 및 바인딩 구현은 ILP 구현과 동일한 작업 부하를 효율적으로 처리하여 빠른 실행 시간과 낮은 메모리 사용량을 제공하므로 확장에 적합합니다.

  • ILP 구현은 최적화된 솔버로 인해 더 큰 작업 부하를 효율적으로 처리합니다.

  • A* 구현은 높은 실행 시간과 메모리 사용량으로 인해 성능에 어려움을 겪습니다.

결론

Branch and Bound 알고리즘을 사용하여 최적화된 솔루션을 사용하여 추가 비교를 추가했는데, 이는 성능 및 리소스 활용 측면에서 ILP 및 A* 알고리즘에 비해 얼마나 크게 향상되었는지 보여줍니다. Branch and Bound 알고리즘에 사용되는 작업량은 ILP 알고리즘과 동일합니다.

Branch and Bound 기반 BenchmarkBranchGenerateReportLocalParallel 기능은 탁월한 성능 향상을 보여 높은 동시성과 효율적인 리소스 관리가 요구되는 서버 환경에 매우 적합합니다.

분기 및 경계 접근 방식의 장점을 활용하고 이를 특정 문제에 맞게 최적화하는 데 중점을 두어 프로젝트의 성능과 확장성을 유지하고 증가하는 수요를 쉽게 처리할 수 있도록 할 수 있습니다.

최종 생각

강력한 애플리케이션을 구축하려면 성능, 확장성, 개발자 경험의 균형을 맞추는 것이 중요합니다. 분기 및 바운드 접근 방식은 현재 설정에서 가장 효율적인 것으로 입증되었으며 합리적인 개발 노력으로 상당한 성능 향상을 제공합니다.

각 알고리즘 접근 방식의 장점을 지속적으로 프로파일링하고 최적화하고 활용함으로써 고성능의 확장 가능하며 개발자 친화적인 시스템을 유지할 수 있습니다.

위 내용은 비교 벤치마킹: 처리량이 많은 시나리오의 ILP, A*, 분기 및 바운드 알고리즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
GO 애플리케이션에서 로깅 오류가 효과적입니다GO 애플리케이션에서 로깅 오류가 효과적입니다Apr 30, 2025 am 12:23 AM

효과적인 GO 애플리케이션 오류 로깅에는 밸런싱 세부 사항 및 성능이 필요합니다. 1) 표준 로그 패키지 사용은 간단하지만 컨텍스트가 부족합니다. 2) Logrus는 구조화 된 로그 및 사용자 정의 필드를 제공합니다. 3) ZAP는 성능과 구조화 된 로그를 결합하지만 더 많은 설정이 필요합니다. 완전한 오류 로깅 시스템에는 오류 강화, 로그 레벨, 중앙 집중식 로깅, 성능 고려 사항 및 오류 처리 모드가 포함되어야합니다.

Go의 빈 인터페이스 (인터페이스 {}) : 사용 사례 및 고려 사항Go의 빈 인터페이스 (인터페이스 {}) : 사용 사례 및 고려 사항Apr 30, 2025 am 12:23 AM

NOMPLINGOREAREINTERFACES의 NOMETHODS를 사용하고, value를 대표하며, handlingunknowndatatypes를 대적 할 때 houldliedlling니다.

동시성 모델 비교 : GO 대 기타 언어동시성 모델 비교 : GO 대 기타 언어Apr 30, 2025 am 12:20 AM

Go'sconcurrencymodelisuniqueduetoitsuseofgoroutinesandchannels, onuverylight wecondeficeedtotheredtotheredtotheinlanguages ​​likejava, python, andrust.1) go'sgoroutinesArimageTime, gountchernaged-thengernageTime, gendownStoruncUrentlyWithminiments

Go의 동시성 모델 : Goroutines 및 채널이 설명되었습니다Go의 동시성 모델 : Goroutines 및 채널이 설명되었습니다Apr 30, 2025 am 12:04 AM

go'sconcurrencymodelusesgoroutines 및 channelSmanageConcurrentProgrammingEfficially.1) GoroutinesArelightwheightShreadsthathalloweAparAllelizationOftasks, 향상된 성능

GO의 인터페이스 및 다형성 : 코드 재사용 성 달성GO의 인터페이스 및 다형성 : 코드 재사용 성 달성Apr 29, 2025 am 12:31 AM

InterfacesandPolymorphismingoEnhancecodereusabilitableandabledaysainability.

GO에서 'Init'기능의 역할은 무엇입니까?GO에서 'Init'기능의 역할은 무엇입니까?Apr 29, 2025 am 12:28 AM

theinitfunctionorunsautomically weconitializepackages 및 seteptheenvironment.ituplopgortingupglobalvariables, andperformingone-timesetupstasksacrossanypackage

GO의 인터페이스 구성 : 복잡한 추상화 구축GO의 인터페이스 구성 : 복잡한 추상화 구축Apr 29, 2025 am 12:24 AM

인터페이스 조합은 기능을 작고 집중된 인터페이스로 분류하여 GO 프로그래밍에서 복잡한 추상화를 구축합니다. 1) 독자, 작가 및 더 가까운 인터페이스를 정의하십시오. 2) 이러한 인터페이스를 결합하여 파일 및 네트워크 스트림과 같은 복잡한 유형을 만듭니다. 3) ProcessData 함수를 사용하여 이러한 결합 된 인터페이스를 처리하는 방법을 보여줍니다. 이 접근법은 코드 유연성, 테스트 가능성 및 재사용 성을 향상 시키지만 과도한 조각화 및 조합 복잡성을 피하기 위해주의를 기울여야합니다.

GO에서 시작 함수를 사용할 때 잠재적 인 함정 및 고려 사항GO에서 시작 함수를 사용할 때 잠재적 인 함정 및 고려 사항Apr 29, 2025 am 12:02 AM

inittectionsingoareautomaticallyCalledBeforeMainForeChalledBectOnforTeForTupButcomewithChalleds

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기