fork download
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "sync"
  6. "time"
  7. )
  8.  
  9. func sumUsingParallelWorker(start int64, end int64) int64 {
  10. var partialSum int64 = 0
  11.  
  12. for i := start; i <= end; i++ {
  13. partialSum += i
  14. }
  15.  
  16. return partialSum
  17. }
  18.  
  19. func main() {
  20. var n int64 = 100000000
  21. var workerCountForSum = 4
  22.  
  23. var tempSum int64 = 0
  24. fmt.Println("Calculating sum from 1 to", n, "using single loop")
  25. var startTime = time.Now()
  26. for i := int64(1); i <= n; i++ {
  27. tempSum += i
  28. }
  29. var duration = time.Since(startTime)
  30. fmt.Println("Sum using single loop =", tempSum)
  31. fmt.Println("Time taken for sum using single loop = ", duration)
  32.  
  33. var wg sync.WaitGroup
  34. fmt.Println("\nCalculating sum from 1 to", n, "using", workerCountForSum, "parallel workers")
  35. chunkSize := n / int64(workerCountForSum)
  36. results := make([]int64, workerCountForSum)
  37. startTime = time.Now()
  38. wg.Add(workerCountForSum)
  39. go func() {
  40. defer wg.Done()
  41. results[0] = sumUsingParallelWorker(1, chunkSize)
  42. }()
  43.  
  44. go func() {
  45. defer wg.Done()
  46. results[1] = sumUsingParallelWorker(chunkSize+1, chunkSize*2)
  47. }()
  48. go func() {
  49. defer wg.Done()
  50. results[2] = sumUsingParallelWorker(chunkSize*2+1, chunkSize*3)
  51. }()
  52. go func() {
  53. defer wg.Done()
  54. results[3] = sumUsingParallelWorker(chunkSize*3+1, n)
  55. }()
  56. wg.Wait()
  57.  
  58. var parallelSum int64 = 0
  59.  
  60. for _, value := range results {
  61. parallelSum += value
  62. }
  63.  
  64. duration = time.Since(startTime)
  65.  
  66. fmt.Println("Sum using parallel workers =", parallelSum)
  67. fmt.Println("Time taken for sum using parallel workers =", duration)
  68.  
  69. fmt.Println("All workers finished")
  70. }
  71.  
Success #stdin #stdout 0.1s 5324KB
stdin
Standard input is empty
stdout
Calculating sum from 1 to 100000000 using single loop
Sum using single loop = 5000000050000000
Time taken for sum using single loop =  46.700208ms

Calculating sum from 1 to 100000000 using 4 parallel workers
Sum using parallel workers = 5000000050000000
Time taken for sum using parallel workers = 44.317098ms
All workers finished