package main
import (
"fmt"
"sync"
"time"
)
func sumUsingParallelWorkers( start int64 , end int64 , results [ ] int64 , index int , wg * sync.WaitGroup ) {
defer wg.Done ( )
var localSum int64 = 0
for i := start; i <= end; i++ {
localSum += i
}
results[ index] = localSum
}
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 sumUsingParallelWorkers( 1 , chunkSize, results, 0 , & wg)
go sumUsingParallelWorkers( chunkSize+ 1 , chunkSize* 2 , results, 1 , & wg)
go sumUsingParallelWorkers( chunkSize* 2 + 1 , chunkSize* 3 , results, 2 , & wg)
go sumUsingParallelWorkers( chunkSize* 3 + 1 , n, results, 3 , & wg)
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" )
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKCSJzeW5jIgoJInRpbWUiCikKCmZ1bmMgc3VtVXNpbmdQYXJhbGxlbFdvcmtlcnMoc3RhcnQgaW50NjQsIGVuZCBpbnQ2NCwgcmVzdWx0cyBbXWludDY0LCBpbmRleCBpbnQsIHdnICpzeW5jLldhaXRHcm91cCkgewoJZGVmZXIgd2cuRG9uZSgpCgl2YXIgbG9jYWxTdW0gaW50NjQgPSAwCglmb3IgaSA6PSBzdGFydDsgaSA8PSBlbmQ7IGkrKyB7CgkJbG9jYWxTdW0gKz0gaQoJfQoJcmVzdWx0c1tpbmRleF0gPSBsb2NhbFN1bQp9CmZ1bmMgbWFpbigpIHsKCXZhciBuIGludDY0ID0gMTAwMDAwMDAwCgl2YXIgd29ya2VyQ291bnRGb3JTdW0gPSA0CgoJdmFyIHRlbXBTdW0gaW50NjQgPSAwCglmbXQuUHJpbnRsbigiQ2FsY3VsYXRpbmcgc3VtIGZyb20gMSB0byIsIG4sICJ1c2luZyBzaW5nbGUgbG9vcCIpCgl2YXIgc3RhcnRUaW1lID0gdGltZS5Ob3coKQoJZm9yIGkgOj0gaW50NjQoMSk7IGkgPD0gbjsgaSsrIHsKCQl0ZW1wU3VtICs9IGkKCX0KCXZhciBkdXJhdGlvbiA9IHRpbWUuU2luY2Uoc3RhcnRUaW1lKQoJZm10LlByaW50bG4oIlN1bSB1c2luZyBzaW5nbGUgbG9vcCA9IiwgdGVtcFN1bSkKCWZtdC5QcmludGxuKCJUaW1lIHRha2VuIGZvciBzdW0gdXNpbmcgc2luZ2xlIGxvb3AgPSAiLCBkdXJhdGlvbikKCgl2YXIgd2cgc3luYy5XYWl0R3JvdXAKCWZtdC5QcmludGxuKCJcbkNhbGN1bGF0aW5nIHN1bSBmcm9tIDEgdG8iLCBuLCAidXNpbmciLCB3b3JrZXJDb3VudEZvclN1bSwgInBhcmFsbGVsIHdvcmtlcnMiKQoJY2h1bmtTaXplIDo9IG4gLyBpbnQ2NCh3b3JrZXJDb3VudEZvclN1bSkKCXJlc3VsdHMgOj0gbWFrZShbXWludDY0LCB3b3JrZXJDb3VudEZvclN1bSkKCXN0YXJ0VGltZSA9IHRpbWUuTm93KCkKCXdnLkFkZCh3b3JrZXJDb3VudEZvclN1bSkKCWdvIHN1bVVzaW5nUGFyYWxsZWxXb3JrZXJzKDEsIGNodW5rU2l6ZSwgcmVzdWx0cywgMCwgJndnKQoJZ28gc3VtVXNpbmdQYXJhbGxlbFdvcmtlcnMoY2h1bmtTaXplKzEsIGNodW5rU2l6ZSoyLCByZXN1bHRzLCAxLCAmd2cpCglnbyBzdW1Vc2luZ1BhcmFsbGVsV29ya2VycyhjaHVua1NpemUqMisxLCBjaHVua1NpemUqMywgcmVzdWx0cywgMiwgJndnKQoJZ28gc3VtVXNpbmdQYXJhbGxlbFdvcmtlcnMoY2h1bmtTaXplKjMrMSwgbiwgcmVzdWx0cywgMywgJndnKQoJd2cuV2FpdCgpCgoJdmFyIHBhcmFsbGVsU3VtIGludDY0ID0gMAoKCWZvciBfLCB2YWx1ZSA6PSByYW5nZSByZXN1bHRzIHsKCQlwYXJhbGxlbFN1bSArPSB2YWx1ZQoJfQoKCWR1cmF0aW9uID0gdGltZS5TaW5jZShzdGFydFRpbWUpCgoJZm10LlByaW50bG4oIlN1bSB1c2luZyBwYXJhbGxlbCB3b3JrZXJzID0iLCBwYXJhbGxlbFN1bSkKCWZtdC5QcmludGxuKCJUaW1lIHRha2VuIGZvciBzdW0gdXNpbmcgcGFyYWxsZWwgd29ya2VycyA9IiwgZHVyYXRpb24pCgoJZm10LlByaW50bG4oIkFsbCB3b3JrZXJzIGZpbmlzaGVkIikKfQo=