Skip to content

Latest commit

ย 

History

History
309 lines (202 loc) ยท 17.9 KB

File metadata and controls

309 lines (202 loc) ยท 17.9 KB

item 48 : ์ŠคํŠธ๋ฆผ ๋ณ‘๋ ฌํ™”๋Š” ์ฃผ์˜ํ•ด์„œ ์ ์šฉํ•˜๋ผ

1. ์ž๋ฐ”์˜ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์—ญ์‚ฌ

์ฃผ๋ฅ˜ ์–ธ์–ด ์ค‘, ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธก๋ฉด์—์„œ ์ž๋ฐ”๋Š” ํ•ญ์ƒ ์•ž์„œ๊ฐ”๋‹ค

1) ๋ฆด๋ฆฌ์Šค

์Šค๋ ˆ๋“œ, ๋™๊ธฐํ™”, wait/notify๋ฅผ ์ง€์›ํ–ˆ๋‹ค.

  1. wait : ๊ฐ–๊ณ  ์žˆ๋˜ ๊ณ ์œ  ๋ฝ์„ ํ•ด์ œํ•˜๊ณ , ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๋“ค๊ฒŒ ํ•œ๋‹ค.
  2. notify :์ž ๋“ค์–ด ์žˆ๋˜ ์Šค๋ ˆ๋“œ ์ค‘ ์ž„์˜๋กœ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๊นจ์šด๋‹ค.

2) ์ž๋ฐ” 5 ์ดํ›„

๋™์‹œ์„ฑ ์ปฌ๋ ‰์…˜์ธ java.util.concurrent ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‹คํ–‰์ž(Executor) ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›ํ–ˆ๋‹ค.

3) ์ž๋ฐ” 7 ์ดํ›„

๊ณ ์„ฑ๋Šฅ ๋ณ‘๋ ฌ ๋ถ„ํ•ด ํ”„๋ ˆ์ž„์›Œํฌ์ธ ํฌํฌ-์กฐ์ธ(fork-join) ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

4) ์ž๋ฐ” 8 ์ดํ›„

parallel ๋ฉ”์„œ๋“œ๋งŒ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ณ‘๋ ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ–ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์ ์  ์‰ฌ์›Œ์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ• ๋•Œ๋Š” ํ•ญ์ƒ ์•ˆ์ „์„ฑ(safety)์™€ ์‘๋‹ต ๊ฐ€๋Šฅ(liveness) ์ƒํƒœ๋ฅผ ์œ ์ง€ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

2. ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฃผ์˜์ 

1) ์ŠคํŠธ๋ฆผ ๋ณ‘๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ

์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•ด ์ฒ˜์Œ 20๊ฐœ์˜ ๋ฉ”๋ฅด์„ผ ์†Œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

๋ฉ”๋ฅด์„ผ ์†Œ์ˆ˜๋ž€? 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์—์„œ 1์„ ๋บ€ ํ˜•ํƒœ์˜ ์ˆ˜๋กœ, ์†Œ์ˆ˜์ธ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

import java.math.BigInteger;
import java.util.stream.Stream;

public class MersennePrimes {
    public static void main(String[] args) {
        // ์†Œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฉ”๋ฅด์„ผ ์†Œ์ˆ˜์ธ์ง€ ํ™•์ธ ํ›„ ์ƒ์œ„ 20๊ฐœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ
        primes() // ์†Œ์ˆ˜ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
                .map(p -> TWO.pow(p.intValueExact()).subtract(ONE)) // ๋ฉ”๋ฅด์„ผ ์ˆ˜ ๊ณ„์‚ฐ: 2^p - 1
                .filter(mersenne -> mersenne.isProbablePrime(50)) // ๋ฉ”๋ฅด์„ผ ์ˆ˜๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ๊ฒ€์‚ฌ
                .limit(20) // ์ƒ์œ„ 20๊ฐœ์˜ ๋ฉ”๋ฅด์„ผ ์†Œ์ˆ˜๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
                .forEach(System.out::println); // ๊ฐ ๋ฉ”๋ฅด์„ผ ์†Œ์ˆ˜ ์ถœ๋ ฅ
    }

    // ๋ฌดํ•œ ์†Œ์ˆ˜ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
    static Stream<BigInteger> primes() {
        return Stream.iterate(TWO, BigInteger::nextProbablePrime); // 2๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์Œ ์†Œ์ˆ˜๋ฅผ ๊ณ„์† ์ƒ์„ฑ
    }

    // ์ƒ์ˆ˜ ์ •์˜
    private static final BigInteger TWO = BigInteger.valueOf(2);
    private static final BigInteger ONE = BigInteger.ONE;
}

์ด ํ”„๋กœ๊ทธ๋žจ์„ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ฆ‰๊ฐ ์†Œ์ˆ˜๋ฅผ ์ฐ๊ธฐ ์‹œ์ž‘ํ•ด์„œ 12.5์ดˆ ๋งŒ์— ์™„๋ฃŒ๋œ๋‹ค.

์†๋„๋ฅผ ๋†’์ด๊ณ  ์‹ถ์–ด ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์˜ parallel()์„ ํ˜ธ์ถœํ•˜๊ฒ ๋‹ค๋Š”์ƒ๊ฐ์„ ํ•˜๊ณ  ์‚ฌ์šฉ์‹œ, ์„ฑ๋Šฅ์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ๊นŒ๏ผŸ

@Test
    public void mersenne() {
        primes()
                .parallel()
                .map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
                .filter(mersenne -> mersenne.isProbablePrime(50))
                .limit(20)
                .forEach(mp -> System.out.println(mp.bitLength() + ": " + mp));
    }

๋ฌด์ž‘์ • ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด parallel() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์œ„์™€ ๊ฐ™์ด ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅํ•˜์ง€ ๋ชปํ•˜๋ฉด์„œ CPU๋Š” 90% ๋‚˜ ์žก์•„๋จน๋Š” ์ƒํƒœ๊ฐ€ ๋ฌดํ•œํžˆ ๊ณ„์†๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ณ‘๋ ฌํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‚ด์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

๐Ÿ”– ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌํ™”๋กœ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
1. ๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ Stream.iterate์ธ ๊ฒฝ์šฐ
2. ์ค‘๊ฐ„ ์—ฐ์‚ฐ์œผ๋กœ limit ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

์œ„์˜ ์ฝ”๋“œ๋Š” 2๊ฐ€์ง€์˜ ๋ฌธ์ œ ๋ชจ๋‘๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.

  • ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌํ™”๋Š” limit ์ด ์žˆ์„ ๋•Œ, CPU ์ฝ”์–ด๊ฐ€ ๋‚จ๋Š”๋‹ค๋ฉด ์›์†Œ๋ฅผ ๋ช‡๊ฐœ ๋” ์ฒ˜๋ฆฌํ•œ ํ›„ ์ œํ•œ๋œ ๊ฐœ์ˆ˜ ์ดํ›„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„๋ ค๋„ ์•„๋ฌด๋Ÿฐ ํ•ด๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
  • ๊ณ„์† ๋ฒ„๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์ด์ „๊นŒ์ง€์˜ ๊ฐ’์„ ๋‹ค์‹œ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งˆ๊ตฌ์žก์ด๋กœ ๋ณ‘๋ ฌํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ๋”์ฐํ•˜๊ฒŒ ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ ๋ณ‘๋ ฌํ™” + forEach

https://stackoverflow.com/questions/60095513/why-is-list-parallelstream-foreach-not-processing-all-the-elements-in-the-li

2) ์ŠคํŠธ๋ฆผ ๋ณ‘๋ ฌํ™”๋Š” ์–ด๋–ค ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

{% hint style="success" %} ๋Œ€์ฒด๋กœ ์ŠคํŠธ๋ฆผ์˜ ์†Œ์Šค๊ฐ€ ArrayList, HashMap, HashSet, ConcurrentHashMap์˜ ์ธ์Šคํ„ด์Šค๊ฑฐ๋‚˜ ๋ฐฐ์—ด, int ๋ฒ”์œ„, long ๋ฒ”์œ„์ผ ๋•Œ ๋ณ‘๋ ฌํ™”์˜ ํšจ๊ณผ๊ฐ€ ๊ฐ€์žฅ ์ข‹๋‹ค. {% endhint %}

ํ•ด๋‹น ์ž๋ฃŒ๊ตฌ์กฐ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ๊ณตํ†ต์ ์„ ์ง€๋‹Œ๋‹ค.

1. ์ •ํ™•์„ฑ

๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํฌ๊ธฐ๋กœ ์ •ํ™•ํ•˜๊ณ  ์†์‰ฝ๊ฒŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด ๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ์— ์ผ์„ ๋ถ„๋ฐฐํ•˜๊ธฐ์— ์ข‹๋‹ค. ๋‚˜๋ˆ„๋Š” ์ž‘์—…์€ Spliterator ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, Iterable ๊ณผ Stream ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

2. ์ฐธ์กฐ ์ง€์—ญ์„ฑ(locality of reference) ๋›ฐ์–ด๋‚จ

์ฐธ์กฐ ์ง€์—ญ์„ฑ์€, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

  1. ์‹œ๊ฐ„ ์ง€์—ญ์„ฑ : ์ตœ๊ทผ์— ์ฐธ์กฐ๋œ ์ฃผ์†Œ๋Š” ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ๋‹ค์‹œ ์ฐธ์กฐ๋˜๋Š” ํŠน์„ฑ
  2. ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ : ์ฐธ์กฐ๋œ ์ฃผ์†Œ์™€ ์ธ์ ‘ํ•œ ์ฃผ์†Œ์˜ ๋‚ด์šฉ์ด ๋‹ค์‹œ ์ฐธ์กฐ๋˜๋Š” ํŠน์„ฑ
  3. ์ˆœ์ฐจ ์ง€์—ญ์„ฑ : ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์—‘์„ธ์Šค ๋˜๋Š” ํŠน์„ฑ(๊ณต๊ฐ„ ์ง€์—ญ์„ฑ)

๐Ÿ”– ์ฐธ์กฐ ์ง€์—ญ์„ฑ
1. ๋†’์Œ : ์ด์›ƒํ•œ ์›์†Œ์˜ ์ฐธ์กฐ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†ํ•ด์„œ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ
2. ๋‚ฎ์Œ : ์ฐธ์กฐ๋“ค์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์„œ๋กœ ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ

์ฐธ์กฐ ์ง€์—ญ์„ฑ์€, ์š”์ฒญํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฐพ์„ ํ™•๋ฅ ์ธ Cache Hit Rate ๊ณผ๋„ ๋น„๋ก€ํ•œ๋‹ค. ์ฐธ์กฐ ์ง€์—ญ์„ฑ์ด ๋†’์œผ๋ฉด ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€๋งŒ, ๋‚ฎ๋‹ค๋ฉด ์ฃผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์บ์‹œ๋กœ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์†ก๋˜์–ด ์˜ค๊ธฐ๋งŒ์„๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ๋น„์–ด, ์„ฑ๋Šฅ์ด ๋‚ฎ์•„์ง„๋‹ค.

๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†ํ•ด์„œ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฐธ์กฐ ์ง€์—ญ์„ฑ ์ค‘์—์„œ๋„ ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ์ด ์ข‹์•„ Cache Hit Rate ์ด ๊ฐ€์žฅ ๋†’๋‹ค.

ArrayList ๋‚˜ Hash ์ž๋ฃŒ๊ตฌ์กฐ ๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด(ํ•ด์‹œ ํ…Œ์ด๋ธ”)์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฐธ์กฐ ์ง€์—ญ์„ฑ์ด ๋†’๋‹ค.

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {
    
    transient Node<K,V>[] table;
}

๊ฒฐ๋ก ์ ์œผ๋กœ, ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฒŒํฌ ์—ฐ์‚ฐ์„ ๋ณ‘๋ ฌํ™” ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ฐธ์กฐ ์ง€์—ญ์„ฑ์„ ๊ณ ๋ คํ•˜๋„๋ก ํ•˜์ž.

3. ์ข…๋‹จ ์—ฐ์‚ฐ๊ณผ ๋ณ‘๋ ฌํ™”

์ข…๋‹จ ์—ฐ์‚ฐ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…๋Ÿ‰์ด ํŒŒ์ดํ”„๋ผ์ธ ์ „์ฒด ์ž‘์—…์—์„œ ์ƒ๋‹น ๋น„์ค‘์„ ์ฐจ์ง€ํ•˜๋ฉด์„œ ์ˆœ์ฐจ์ ์ธ ์—ฐ์‚ฐ์ด๋ผ๋ฉด, ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌ ์ˆ˜ํ–‰์˜ ํšจ๊ณผ๊ฐ€ ๋–จ์–ด์ง„๋‹ค.

๋ณ‘๋ ฌํ™”๋Š” ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋„๋ชจํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ŠคํŠธ๋ฆผ ์ž‘์—…์ด ๋ณ‘๋ ฌํ™”์— ์ ํ•ฉํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ‘๋ ฌํ™”๋ฅผ ์ ์šฉํ•  ๋•Œ๋Š” ์ž‘์—…์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

1) ๋ณ‘๋ ฌ ์ˆ˜ํ–‰์— ์ ํ•ฉํ•œ ์—ฐ์‚ฐ๋“ค

์ถ•์†Œ(reduction) ์—ฐ์‚ฐ

์ถ•์†Œ(reduction) ์—ฐ์‚ฐ์€ ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ•˜๋‚˜๋กœ ์ค„์ด๋Š” ์ž‘์—…์œผ๋กœ, ๋ณ‘๋ ฌํ™”์— ๋งค์šฐ ์ ํ•ฉํ•˜๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ถ„์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•œ ํ›„ ๊ฒฐํ•ฉํ•˜๊ธฐ๊ฐ€ ์‰ฌ์šด ์ž‘์—…๋“ค์ด ๋ณ‘๋ ฌํ™”์˜ ํšจ๊ณผ๋ฅผ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ ํ•ฉํ•œ ์ถ•์†Œ ์—ฐ์‚ฐ:
    • min(), max(): ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ.
    • count(), sum(): ์›์†Œ์˜ ๊ฐœ์ˆ˜๋‚˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ์—ฐ์‚ฐ.
    • ์ด๋“ค ์—ฐ์‚ฐ์€ ์‰ฝ๊ฒŒ ์ชผ๊ฐœ์„œ ๊ฐ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜ ์—ฐ์‚ฐ

  • ์กฐ๊ฑด์— ๋งž์œผ๋ฉด ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ๋ฝ(short-circuiting) ์—ฐ์‚ฐ๋„ ๋ณ‘๋ ฌํ™”์— ์ ํ•ฉํ•˜๋‹ค.
    • anyMatch(): ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ๋ผ๋„ ์ฐพ์œผ๋ฉด ๋ฐ”๋กœ ์ข…๋ฃŒ.
    • allMatch(), noneMatch(): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ.

์ด๋“ค ๋ฉ”์„œ๋“œ๋Š” ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ์ฆ‰์‹œ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์–ด, ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ํ›„ ์ผ๋ถ€๋งŒ ํ™•์ธํ•ด๋„ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ณ‘๋ ฌํ™”์˜ ์ ์šฉ ์˜ˆ์‹œ ์ฝ”๋“œ

๋‹ค์Œ์€ 2๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ณ‘๋ ฌํ™” ์ฝ”๋“œ์ด๋‹ค. ์ˆซ์ž๋ฅผ ๋ฒ”์œ„๋ณ„๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ์—์„œ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•œ๋‹ค.

public long pi(long n) {
    return LongStream.range(2, n) // 2๋ถ€ํ„ฐ n-1๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ ์ƒ์„ฑ
            .parallel() // ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ (์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์‚ฌ์šฉ)
            .mapToObj(BigInteger::valueOf) // ๊ฐ ์ˆซ์ž๋ฅผ BigInteger๋กœ ๋ณ€ํ™˜
            .filter(i -> i.isProbablePrime(50)) // ์†Œ์ˆ˜์ธ์ง€ ํ™•๋ฅ ์ ์œผ๋กœ ํ™•์ธ (50๋ฒˆ ํ…Œ์ŠคํŠธ)
            .count(); // ์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
}
  • parallel(): ์ŠคํŠธ๋ฆผ์„ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ํšจ๊ณผ:
    • ๋ณ‘๋ ฌํ™”๊ฐ€ ์ž˜ ์ ์šฉ๋˜๋ฉด ์—ฌ๋Ÿฌ ์ˆซ์ž๋ฅผ ๋™์‹œ์— ์†Œ์ˆ˜ ํŒ๋ณ„ํ•˜๋ฏ€๋กœ, ์„ฑ๋Šฅ์ด ์•ฝ 5๋ฐฐ ์ด์ƒ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์œ„ ์ฝ”๋“œ๋Š” ์ชผ๊ฐœ๊ธฐ ์‰ฌ์šด ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘๋ ฌํ™”๊ฐ€ ํšจ๊ณผ์ ์ด๋‹ค.

2) ๋ณ‘๋ ฌํ™”์˜ ์กฐ๊ฑด๊ณผ ์ฃผ์˜์‚ฌํ•ญ

Spliterator์™€ ๋ณ‘๋ ฌํ™” ํ…Œ์ŠคํŠธ

  • Spliterator ์žฌ์ •์˜: ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ๋ฐ์ดํ„ฐ์˜ ์ชผ๊ฐœ๊ธฐ์™€ ํƒ์ƒ‰์„ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด Spliterator๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
    • Spliterator๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• (splitting)ํ•˜๊ณ , ํƒ์ƒ‰(iteration)ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋ณ‘๋ ฌํ™”๋ฅผ ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ๋ณ‘๋ ฌํ™” ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ: ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ญ์ƒ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์‹ค์ œ๋กœ ๋ณ‘๋ ฌํ™”๊ฐ€ ํšจ์œจ์ ์ธ์ง€ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค. ์ž˜๋ชป๋œ ๋ณ‘๋ ฌํ™”๋Š” ์„ฑ๋Šฅ์„ ์˜คํžˆ๋ ค ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐํ•ฉ ๋ฒ•์น™๊ณผ ์•ˆ์ „ ์‹คํŒจ ๋ฐฉ์ง€

  • ๊ฒฐํ•ฉ ๋ฒ•์น™(Associativity):
    • ๋ณ‘๋ ฌํ™”์—์„œ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐํ•ฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” accumulator์™€ combiner ํ•จ์ˆ˜๊ฐ€ ๊ฒฐํ•ฉ ๋ฒ•์น™์„ ์ง€์ผœ์•ผ ๋ณ‘๋ ฌํ™”๋œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•˜๋‹ค.
  • ๊ฐ„์„ญ(Interference):
    • ์ŠคํŠธ๋ฆผ ์ž‘์—… ์ค‘๊ฐ„์— ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋ณ‘๋ ฌํ™”์—์„œ ์•ˆ์ „ ์‹คํŒจ(safety failure)๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ‘๋ ฌํ™”๋œ ์ŠคํŠธ๋ฆผ ์ž‘์—…์—์„œ ์™ธ๋ถ€ ์ƒํƒœ์™€์˜ ๊ฐ„์„ญ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.
  • ์ƒํƒœ๋ฅผ ๊ฐ–์ง€ ์•Š์•„์•ผ ํ•จ:
    • ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋Š” ์ƒํƒœ๋ฅผ ๊ฐ–์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ณต์œ ๋œ ๊ฐ€๋ณ€ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋‹ค.

3) ์ž˜๋ชป๋œ ๋ณ‘๋ ฌํ™”์™€ ํ•ด๊ฒฐ์ฑ…

์ž˜๋ชป๋œ ๋ณ‘๋ ฌํ™”์˜ ๋ฌธ์ œ์ 

  • ์„ฑ๋Šฅ ์ €ํ•˜: ์ž‘์—…์ด ๋ณ‘๋ ฌํ™”์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ž‘์—… ๊ฐ„์˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ๋” ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘:
    • ๋ณ‘๋ ฌํ™”๋œ ์ž‘์—…์—์„œ ๊ณต์œ  ์ž์›์— ๋™๊ธฐํ™” ์—†์ด ์ ‘๊ทผํ•˜๋ฉด ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋‚˜ ๋ฐ์ดํ„ฐ ์˜ค์—ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Random ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ์–ด ๋ณ‘๋ ฌํ™” ์„ฑ๋Šฅ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ณ‘๋ ฌํ™”์— ์ ํ•ฉํ•œ Random ์‚ฌ์šฉ: SplittableRandom

  • SplittableRandom:
    • ๋ณ‘๋ ฌํ™”๋œ ์ž‘์—…์—์„œ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” SplittableRandom์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • Random ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒฝ์šฐ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜์—ฌ ์ตœ์•…์˜ ์„ฑ๋Šฅ์„ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.
    • SplittableRandom์€ ๋ณ‘๋ ฌ ํ™˜๊ฒฝ์—์„œ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋œ ํด๋ž˜์Šค

์ฝ”๋“œ ์˜ˆ์ œ: SplittableRandom ์‚ฌ์šฉ

import java.util.SplittableRandom;
import java.util.stream.IntStream;

public class ParallelRandomStream {
    public static void main(String[] args) {
        SplittableRandom random = new SplittableRandom();

        // ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์ž‘์œ„ ์ˆซ์ž ์ƒ์„ฑ ๋ฐ ์ถœ๋ ฅ
        IntStream.generate(() -> random.nextInt(100)) // 0๋ถ€ํ„ฐ 99 ์‚ฌ์ด์˜ ๋ฌด์ž‘์œ„ ์ˆซ์ž ์ƒ์„ฑ
                .parallel() // ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
                .limit(10) // 10๊ฐœ์˜ ์ˆซ์ž๋งŒ ์ƒ์„ฑ
                .forEach(System.out::println);
    }
}
  • ์„ค๋ช…:
    • SplittableRandom์€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”๋œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์ด๋ฏ€๋กœ, ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์—์„œ ์‚ฌ์šฉํ•ด๋„ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

SplittableRandom๊ณผ Random ๋น„๊ต

ํŠน์„ฑ Random SplittableRandom
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ตœ์ ํ™” ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ๋ถ€์ ํ•ฉ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™” (๋…๋ฆฝ์ ์ธ ๋ถ„ํ•  ๊ฐ€๋Šฅ)
๋™๊ธฐํ™” ๋‚ด๋ถ€ ์ƒํƒœ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ๋™๊ธฐํ™” ํ•„์š” ๋™๊ธฐํ™” ๋ถˆํ•„์š”
๋‚œ์ˆ˜ ์ƒ์„ฑ ๋ฐฉ์‹ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ (LCG) ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ
๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

4) ์š”์•ฝ ๋ฐ ๊ฒฐ๋ก 

์ ํ•ฉํ•œ ์ข…๋‹จ ์—ฐ์‚ฐ

์ถ•์†Œ(reduction) ์—ฐ์‚ฐ (min(), max(), count() ๋“ฑ)๊ณผ ์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜ ์—ฐ์‚ฐ (anyMatch(), allMatch())์€ ๋ณ‘๋ ฌํ™”์— ์ ํ•ฉํ•˜๋‹ค.

  1. reduce
  2. anyMatch, allMatch, noneMatch
  3. ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ๊ณ  ๊ฒฐํ•ฉํ•˜๊ธฐ ์‰ฌ์šด ์ž‘์—…์ผ์ˆ˜๋ก ๋ณ‘๋ ฌํ™”์˜ ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค.

๋‚˜์œ ์ข…๋‹จ ์—ฐ์‚ฐ

collect ์™€ ๊ฐ™์ด ์ปฌ๋ ‰์…˜๋“ค์„ ํ•ฉ์น˜๋Š” ๋ถ€๋‹ด์ด ํฐ ๋ฉ”์„œ๋“œ๋Š” ๋ณ‘๋ ฌํ™”์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

๋ณ‘๋ ฌํ™” ์ ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ:

  • Spliterator๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธํ•œ ํ›„ ๋ณ‘๋ ฌํ™”๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฒฐํ•ฉ ๋ฒ•์น™๊ณผ ๊ฐ„์„ญ ๊ธˆ์ง€ ์กฐ๊ฑด์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค.
  • ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์—์„œ๋Š” ๊ณต์œ  ์ƒํƒœ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•ด์•ผ ์•ˆ์ „ํ•˜๋‹ค.

์ž˜๋ชป๋œ ๋ณ‘๋ ฌํ™”์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ:

  • Random ๋Œ€์‹  SplittableRandom์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ํ™˜๊ฒฝ์—์„œ ๋‚œ์ˆ˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌํ™”๊ฐ€ ํšจ๊ณผ์ ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

์ƒ๊ฐํ•ด๋ด์•ผ ํ•  ๋ถ€๋ถ„

  • ๋ณ‘๋ ฌํ™”๊ฐ€ ํ•ญ์ƒ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š”๊ฐ€?:
    • ๋ณ‘๋ ฌํ™”๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์—…์˜ ๋น„์šฉ, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ, ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๋ถ„ํ•  ์šฉ์ด์„ฑ ๋“ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ณ‘๋ ฌํ™” ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ์ž‘์—…์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํด ๊ฒฝ์šฐ, ๋ณ‘๋ ฌํ™”๋ฅผ ์ ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ๊ฒฐํ•ฉ์ด ์ž˜ ์ด๋ฃจ์–ด์ง€๋Š”๊ฐ€?:
    • ๋ณ‘๋ ฌํ™”๋œ ์ž‘์—…์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฒฐํ•ฉ์ด ์ •ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฐํ•ฉ ๋ฐฉ์‹์€ ๊ฒฐ๊ณผ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐํ•ฉ ๋ฒ•์น™์„ ํ•ญ์ƒ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ‘๋ ฌํ™” ํ…Œ์ŠคํŠธ:
    • ๋ณ‘๋ ฌํ™” ํšจ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌํ™”๊ฐ€ ํšจ์œจ์ ์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š ํ•ต์‹ฌ ์ •๋ฆฌ

๋ฌด์ž‘์ • ๋ณ‘๋ ฌํ™”๋ฅผ ํ•œ๋‹ค๊ณ  ์†๋„๊ฐ€ ๋นจ๋ผ์งˆ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์ง€ ๋ง์ž.

parallel stream ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ stream ๋ณด๋‹ค ํ›จ์”ฌ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๋›ฐ์–ด ๋„˜์„ ์ •๋„๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ธ ์ž‘์—…์ธ ๊ฒฝ์šฐ(ex) ๋น…๋ฐ์ดํ„ฐ) ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๊ณ  ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

  • ๋ณ‘๋ ฌํ™” ์‹œ ์˜ค๋™์ž‘ ๋“ฑ์˜ ๋ถ€์ž‘์šฉ๋„ ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  • ์„ฑ๋Šฅ์ง€ํ‘œ1๋ฅผ ํ•ญ์ƒ ์œ ์‹ฌํžˆ ๊ด€์ฐฐํ•˜์ž.

์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ 

Footnotes

  1. ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๊ด€์ฐฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํˆด๊ณผ ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค. ์ด๋Ÿฐ ํˆด๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ CPU ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„, ์‘๋‹ต ์‹œ๊ฐ„, ์Šค๋ ˆ๋“œ ์ƒํƒœ ๋“ฑ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
    ์˜ˆ์‹œ : ์™€ํƒญ โ†ฉ