From ab22488bb071120c8d15ad796953602ef7d16cbb Mon Sep 17 00:00:00 2001 From: teivah Date: Sat, 5 Feb 2022 14:07:04 +0100 Subject: [PATCH] Reviews --- 08-concurrency-foundations/56-faster/main.go | 82 +++++++++++--------- 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/08-concurrency-foundations/56-faster/main.go b/08-concurrency-foundations/56-faster/main.go index 5a7ea2a..b5c586e 100644 --- a/08-concurrency-foundations/56-faster/main.go +++ b/08-concurrency-foundations/56-faster/main.go @@ -1,18 +1,54 @@ package main -import "sync" +import ( + "sync" +) func sequentialMergesort(s []int) { - if len(s) > 1 { - middle := len(s) / 2 - sequentialMergesort(s[:middle]) - sequentialMergesort(s[middle:]) - merge(s, middle) + if len(s) <= 1 { + return } + + middle := len(s) / 2 + sequentialMergesort(s[:middle]) + sequentialMergesort(s[middle:]) + merge(s, middle) } func parallelMergesortV1(s []int) { - if len(s) > 1 { + if len(s) <= 1 { + return + } + + middle := len(s) / 2 + + var wg sync.WaitGroup + wg.Add(2) + + go func() { + defer wg.Done() + parallelMergesortV1(s[:middle]) + }() + + go func() { + defer wg.Done() + parallelMergesortV1(s[middle:]) + }() + + wg.Wait() + merge(s, middle) +} + +const max = 2048 + +func parallelMergesortV2(s []int) { + if len(s) <= 1 { + return + } + + if len(s) <= max { + sequentialMergesort(s) + } else { middle := len(s) / 2 var wg sync.WaitGroup @@ -20,12 +56,12 @@ func parallelMergesortV1(s []int) { go func() { defer wg.Done() - parallelMergesortV1(s[:middle]) + parallelMergesortV2(s[:middle]) }() go func() { defer wg.Done() - parallelMergesortV1(s[middle:]) + parallelMergesortV2(s[middle:]) }() wg.Wait() @@ -33,34 +69,6 @@ func parallelMergesortV1(s []int) { } } -const max = 2048 - -func parallelMergesortV2(s []int) { - if len(s) > 1 { - if len(s) <= max { - sequentialMergesort(s) - } else { - middle := len(s) / 2 - - var wg sync.WaitGroup - wg.Add(2) - - go func() { - defer wg.Done() - parallelMergesortV2(s[:middle]) - }() - - go func() { - defer wg.Done() - parallelMergesortV2(s[middle:]) - }() - - wg.Wait() - merge(s, middle) - } - } -} - func merge(s []int, middle int) { helper := make([]int, len(s)) copy(helper, s)