Advertisement
paranid5

sum

May 25th, 2021 (edited)
1,291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.72 KB | None | 0 0
  1. import java.time.LocalTime
  2. import kotlin.random.Random
  3.  
  4. fun main() {
  5.     println("Array's size:")
  6.     val m = readLine()!!.trim().toInt()
  7.  
  8.     println("Threads amount")
  9.     val n = readLine()!!.trim().toInt()
  10.  
  11.     val arr = IntArray(m) { Random.nextInt(1000) }
  12.  
  13.     /*println("Array: ")
  14.     arr.forEach { print("$it ") }.apply(::println)*/
  15.  
  16.     // --------------------------------------- SINGLE ---------------------------------------
  17.  
  18.     val res1 = {
  19.         val start = LocalTime.now().nano
  20.         val res = arr.sum()
  21.         val finish = LocalTime.now().nano
  22.         println("Single thread: ${maxOf(start, finish) - minOf(start, finish)}")
  23.         res
  24.     }()
  25.  
  26.     // --------------------------------------- MULTI ---------------------------------------
  27.  
  28.     val res2 = {
  29.         val start = LocalTime.now().nano
  30.         val _d = m / n
  31.         val numsInThreads = IntArray(n) { _d }
  32.         val ost = m % n
  33.         (0 until ost).forEach { numsInThreads[it]++ }
  34.  
  35.         var cur = 0
  36.         var res = 0
  37.         val threads = Array(n) { Thread() }
  38.         val _a = Any()
  39.  
  40.         numsInThreads.forEachIndexed { ind, numsAmount ->
  41.             val _cur = cur
  42.  
  43.             threads[ind] = Thread {
  44.                 var subRes = 0
  45.                 val f = _cur + numsAmount
  46.                 (_cur until f).forEach { subRes += arr[it] }
  47.                 synchronized(_a) { res += subRes }
  48.             }.apply(Thread::start)
  49.  
  50.             cur += numsAmount
  51.         }
  52.  
  53.         threads.forEach(Thread::join)
  54.  
  55.         val finish = LocalTime.now().nano
  56.         println("Multi thread:  ${maxOf(start, finish) - minOf(start, finish)}")
  57.         res
  58.     }()
  59.  
  60.     if (res1 != res2) throw Exception("Sums are not equal")
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement