package main
import (
"fmt"
"sync"
"time"
)
func sumUsingParallelWorker( start int64 , end int64 ) int64 {
var partialSum int64 = 0
for i := start; i <= end; i++ {
partialSum += i
}
return partialSum
}
func main( ) {
var n int64 = 100000000
var workerCountForSum = 4
var tempSum int64 = 0
fmt.Println ( "Calculating sum from 1 to" , n, "using single loop" )
var startTime
= time .
Now ( ) for i := int64 ( 1 ) ; i <= n; i++ {
tempSum += i
}
var duration
= time .
Since ( startTime
) fmt.Println ( "Sum using single loop =" , tempSum)
fmt.Println ( "Time taken for sum using single loop = " , duration)
var wg sync.WaitGroup
fmt.Println ( "\n Calculating sum from 1 to" , n, "using" , workerCountForSum, "parallel workers" )
chunkSize := n / int64 ( workerCountForSum)
results := make( [ ] int64 , workerCountForSum)
wg.Add ( workerCountForSum)
go func( ) {
defer wg.Done ( )
results[ 0 ] = sumUsingParallelWorker( 1 , chunkSize)
} ( )
go func( ) {
defer wg.Done ( )
results[ 1 ] = sumUsingParallelWorker( chunkSize+ 1 , chunkSize* 2 )
} ( )
go func( ) {
defer wg.Done ( )
results[ 2 ] = sumUsingParallelWorker( chunkSize* 2 + 1 , chunkSize* 3 )
} ( )
go func( ) {
defer wg.Done ( )
results[ 3 ] = sumUsingParallelWorker( chunkSize* 3 + 1 , n)
} ( )
wg.Wait ( )
var parallelSum int64 = 0
for _, value := range results {
parallelSum += value
}
duration
= time .
Since ( startTime
)
fmt.Println ( "Sum using parallel workers =" , parallelSum)
fmt.Println ( "Time taken for sum using parallel workers =" , duration)
fmt.Println ( "All workers finished" )
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKCSJzeW5jIgoJInRpbWUiCikKCmZ1bmMgc3VtVXNpbmdQYXJhbGxlbFdvcmtlcihzdGFydCBpbnQ2NCwgZW5kIGludDY0KSBpbnQ2NCB7Cgl2YXIgcGFydGlhbFN1bSBpbnQ2NCA9IDAKCglmb3IgaSA6PSBzdGFydDsgaSA8PSBlbmQ7IGkrKyB7CgkJcGFydGlhbFN1bSArPSBpCgl9CgoJcmV0dXJuIHBhcnRpYWxTdW0KfQoKZnVuYyBtYWluKCkgewoJdmFyIG4gaW50NjQgPSAxMDAwMDAwMDAKCXZhciB3b3JrZXJDb3VudEZvclN1bSA9IDQKCgl2YXIgdGVtcFN1bSBpbnQ2NCA9IDAKCWZtdC5QcmludGxuKCJDYWxjdWxhdGluZyBzdW0gZnJvbSAxIHRvIiwgbiwgInVzaW5nIHNpbmdsZSBsb29wIikKCXZhciBzdGFydFRpbWUgPSB0aW1lLk5vdygpCglmb3IgaSA6PSBpbnQ2NCgxKTsgaSA8PSBuOyBpKysgewoJCXRlbXBTdW0gKz0gaQoJfQoJdmFyIGR1cmF0aW9uID0gdGltZS5TaW5jZShzdGFydFRpbWUpCglmbXQuUHJpbnRsbigiU3VtIHVzaW5nIHNpbmdsZSBsb29wID0iLCB0ZW1wU3VtKQoJZm10LlByaW50bG4oIlRpbWUgdGFrZW4gZm9yIHN1bSB1c2luZyBzaW5nbGUgbG9vcCA9ICIsIGR1cmF0aW9uKQoKCXZhciB3ZyBzeW5jLldhaXRHcm91cAoJZm10LlByaW50bG4oIlxuQ2FsY3VsYXRpbmcgc3VtIGZyb20gMSB0byIsIG4sICJ1c2luZyIsIHdvcmtlckNvdW50Rm9yU3VtLCAicGFyYWxsZWwgd29ya2VycyIpCgljaHVua1NpemUgOj0gbiAvIGludDY0KHdvcmtlckNvdW50Rm9yU3VtKQoJcmVzdWx0cyA6PSBtYWtlKFtdaW50NjQsIHdvcmtlckNvdW50Rm9yU3VtKQoJc3RhcnRUaW1lID0gdGltZS5Ob3coKQoJd2cuQWRkKHdvcmtlckNvdW50Rm9yU3VtKQoJZ28gZnVuYygpIHsKCQlkZWZlciB3Zy5Eb25lKCkKCQlyZXN1bHRzWzBdID0gc3VtVXNpbmdQYXJhbGxlbFdvcmtlcigxLCBjaHVua1NpemUpCgl9KCkKCglnbyBmdW5jKCkgewoJCWRlZmVyIHdnLkRvbmUoKQoJCXJlc3VsdHNbMV0gPSBzdW1Vc2luZ1BhcmFsbGVsV29ya2VyKGNodW5rU2l6ZSsxLCBjaHVua1NpemUqMikKCX0oKQoJZ28gZnVuYygpIHsKCQlkZWZlciB3Zy5Eb25lKCkKCQlyZXN1bHRzWzJdID0gc3VtVXNpbmdQYXJhbGxlbFdvcmtlcihjaHVua1NpemUqMisxLCBjaHVua1NpemUqMykKCX0oKQoJZ28gZnVuYygpIHsKCQlkZWZlciB3Zy5Eb25lKCkKCQlyZXN1bHRzWzNdID0gc3VtVXNpbmdQYXJhbGxlbFdvcmtlcihjaHVua1NpemUqMysxLCBuKQoJfSgpCgl3Zy5XYWl0KCkKCgl2YXIgcGFyYWxsZWxTdW0gaW50NjQgPSAwCgoJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIHJlc3VsdHMgewoJCXBhcmFsbGVsU3VtICs9IHZhbHVlCgl9CgoJZHVyYXRpb24gPSB0aW1lLlNpbmNlKHN0YXJ0VGltZSkKCglmbXQuUHJpbnRsbigiU3VtIHVzaW5nIHBhcmFsbGVsIHdvcmtlcnMgPSIsIHBhcmFsbGVsU3VtKQoJZm10LlByaW50bG4oIlRpbWUgdGFrZW4gZm9yIHN1bSB1c2luZyBwYXJhbGxlbCB3b3JrZXJzID0iLCBkdXJhdGlvbikKCglmbXQuUHJpbnRsbigiQWxsIHdvcmtlcnMgZmluaXNoZWQiKQp9Cg==