Задать вопрос
@Berry90

Профит от многопоточности на простом примере?

Многопото́чность слабо понимаю, набросал код на тредах (kotlin)
val start = System.currentTimeMillis()

var arrayStart = mutableListOf<String>()
var arrayResult = mutableListOf<String>()
var arrayHelper1 = mutableListOf<String>()
var arrayHelper2 = mutableListOf<String>()


repeat(3_000_000) {
      arrayStart.add((it * 2).toString())
}

val thread1 = Thread(
        Runnable {
            for (i in 0 until arrayStart.size/2-3 step 3) {
                val t = arrayStart.subList(i, i+3)
                arrayHelper1.addAll(0, t.reversed())
            }
        }
    )

val thread2 = Thread(
        Runnable {
            for (i in arrayStart.size/2..arrayStart.size-3 step 3) {
                val t = arrayStart.subList(i, i+3)
                arrayHelper2.addAll(0, t.reversed())
            }
        }
    )

thread1.start()
thread2.start()
thread1.join()
thread2.join()

arrayResult.addAll(arrayHelper1)
arrayResult.addAll(arrayHelper2)

val time = (System.currentTimeMillis() - start) / 1000
println("time: $time")


и код без тредов

val start = System.currentTimeMillis()

var arrayStart = mutableListOf<String>()
var arrayResult = mutableListOf<String>()
var arrayHelper1 = mutableListOf<String>()
var arrayHelper2 = mutableListOf<String>()

repeat(3_000_000) {
      arrayStart.add((it * 2).toString())
}

for (i in 0 until arrayStart.size/2-3 step 3) {
      val t = arrayStart.subList(i, i+3)
      arrayHelper1.addAll(0, t.reversed())
}

for (i in arrayStart.size/2..arrayStart .size-3 step 3) {
     val t = arrayStart.subList(i, i+3)
     arrayHelper2.addAll(0, t.reversed())
}

arrayResult.addAll(arrayHelper1)
arrayResult.addAll(arrayHelper2)

val time = (System.currentTimeMillis() - start) / 1000
println("time: $time")


оба кода выполнились за ~300 секунд, как нужно написать код чтоб была видна разница?
  • Вопрос задан
  • 264 просмотра
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
память смотреть
Ответ написан
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Это очень опасный пример. Он завязан на фазы уборки мусора. Прогрев JIT. И размер кешей. В зависимости он версий java и ос. И никакой синьор-помидор тут не сможет точно сказать какие переходные процессы текут во 2 варианте кода.

Как переписать - я не знаю. Но мультипоточка всегда полезна при парсинге множества сайтов одновременно. Вот пускай автор сделает веб краулер.
Ответ написан
@koperagen
Взять и написать параллельный код на тредах не так уж тривиально. Лучше берите Stream API, с его помощью сортировки, map-reduce операции и много чего ещё отлично ускоряется кратно количеству ядер.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы