@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 секунд, как нужно написать код чтоб была видна разница?
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 4
dimonchik2013
@dimonchik2013
это не маска, я всегда так выгляжу
память смотреть
Ответ написан
Vamp
@Vamp
У меня ваш код отработал за 181 и 208 сек. Многопоточная версия оказалась быстрее на 13%. То есть разница всё-таки видна.

Почему не 50%? Я не спец по kotlin, но думаю дело в слишком большом количестве элементов, с которыми выбранная вами коллекция не может эффективно работать. Если уменьшить количество до 1 млн, то время получается 15 и 8 сек. Как раз почти 50%.
Ответ написан
@mayton2019
Ent. Software engineer. Oracle. SQL. BigData.
Это очень опасный пример. Он завязан на фазы уборки мусора. Прогрев JIT. И размер кешей. В зависимости он версий java и ос. И никакой синьор-помидор тут не сможет точно сказать какие переходные процессы текут во 2 варианте кода.

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

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

Войти через центр авторизации
Похожие вопросы