Java Academy · Ders

Paralellik Ne Zaman Yararlıdır

İş yükü ve veri boyutu etkenleri

2. ders / 413 adım

Paralellik Ne Zaman Yararlıdır, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Paralelliğin Bir Maliyeti Vardır

Paralel çalışmak ek yük getirir: verileri bölmek, görevleri dağıtmak ve sonuçları birleştirmek gerekir. Bu yaklaşım yalnızca ek yükün kazandırdığı zamandan küçük olduğu durumda yarar sağlar.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long sum = IntStream.rangeClosed(1, 10_000_000)
            .parallel()
            .asLongStream()
            .sum();
        System.out.println(sum);
    }
}

Etken 1: Veri Boyutu (N)

Büyük N, paralelliğin sabit ek yükünü dağıtır. Yaklaşık bir kural olarak, paralel çalışma anlamlı hâle gelmeden önce on binlerce öğe gerekir.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long count = IntStream.rangeClosed(1, 5_000_000)
            .parallel()
            .filter(n -> n % 7 == 0)
            .count();
        System.out.println(count);
    }
}

Etken 2: Öğe Başına İş (Q)

Her öğeyi işlemenin maliyeti olan Q önemlidir. Öğe başına pahalı işler (yoğun hesaplama), daha küçük N değerlerinde bile paralellikten yararlanır.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long primes = IntStream.rangeClosed(2, 200_000)
            .parallel()
            .filter(Main::isPrime)
            .count();
        System.out.println(primes);
    }

    static boolean isPrime(int n) {
        for (int i = 2; (long) i * i <= n; i++)
            if (n % i == 0) return false;
        return true;
    }
}

N Çarpı Q Sezgisi

Toplam yararlı işi N x Q olarak düşünün. Bu çarpım büyüdükçe paralellik daha fazla yardımcı olabilir. Küçük N veya önemsiz Q, paralelliği nadiren haklı çıkarır.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        double sum = IntStream.rangeClosed(1, 1_000_000)
            .parallel()
            .mapToDouble(n -> Math.sqrt(n) * Math.log(n + 1))
            .sum();
        System.out.println(sum);
    }
}

Etken 3: Bölünebilirlik

Ucuza ve dengeli biçimde bölünebilen veri kaynakları paralel çalışmaya uygundur: diziler, ArrayList ve IntStream.range. LinkedList ve yineleyici tabanlı kaynaklar kötü bölünür.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 1_000_000; i++) list.add(i);
        long even = list.parallelStream().filter(n -> n % 2 == 0).count();
        System.out.println(even);
    }
}

İyi Kaynak: Diziler ve Aralıklar

İlkel tür aralıklarının boyutu bilinir ve bunlar O(1) sürede bölünür; bu da onları ideal paralel kaynaklar hâline getirir.

import java.util.stream.LongStream;

public class Main {
    public static void main(String[] args) {
        long sum = LongStream.rangeClosed(1, 20_000_000)
            .parallel()
            .sum();
        System.out.println(sum);
    }
}

Kötü Kaynak: Yinelemeli Üreticiler

Stream.iterate, tanımı gereği öğeleri sıralı olarak üretir; bu nedenle öğeler oluşturulana kadar bölünemez. Paralel çalışma için zayıf bir kaynaktır.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        long count = Stream.iterate(1, n -> n + 1)
            .limit(1_000_000)
            .parallel()
            .filter(n -> n % 2 == 0)
            .count();
        System.out.println(count);
    }
}

Etken 4: Ucuz Birleştirme Adımı

Paralellik, kısmi sonuçları birleştirmek için düşük maliyetli bir yönteme ihtiyaç duyar. sum ve count kolayca birleştirilir; sıralı bir liste veya ağaç yapısı ağırlıklı bir toplayıcı oluşturmak ise pahalı birleştirme gerektirir.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int max = IntStream.rangeClosed(1, 5_000_000)
            .parallel()
            .map(n -> n % 1000)
            .max()
            .getAsInt();
        System.out.println(max);
    }
}

G/Ç Sınırlı İşlerde Kaçının

Paralel stream'ler, çatalla-birleştir havuzunda işlemci sınırlı görevleri hedefler. Engelleyici G/Ç, paylaşılan havuzu boşta bırakır ve uygulamanın tamamına zarar verir. Bunun yerine G/Ç için özel yürütücüler kullanın.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long total = IntStream.rangeClosed(1, 1_000_000)
            .parallel()
            .mapToLong(n -> (long) n * n)
            .sum();
        System.out.println(total);
    }
}

Tahmin Etmeyin, Ölçün

Paralelliğin yardımcı olup olmadığını öğrenmenin tek güvenilir yolu, gerçekçi verilerle karşılaştırmalı ölçüm yapmaktır. Performansla ilgili sezgiler çoğu zaman yanlıştır.

import java.util.stream.LongStream;

public class Main {
    public static void main(String[] args) {
        long start = System.nanoTime();
        long sum = LongStream.rangeClosed(1, 50_000_000).parallel().sum();
        long ms = (System.nanoTime() - start) / 1_000_000;
        System.out.println("sum=" + sum + " took ~" + ms + "ms");
    }
}

Pratik Kontrol Listesi

Aşağıdaki koşulların tümü geçerliyse paralelliği tercih edin:

  • Büyük N ve/veya öğe başına pahalı iş.
  • Bölünebilir bir kaynak (dizi, ArrayList, aralık).
  • Ucuz ve birleşme özelliğine sahip bir birleştirme.
  • İşlemci sınırlı çalışma, engelleyici G/Ç yok.
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        double avg = IntStream.rangeClosed(1, 10_000_000)
            .parallel()
            .mapToDouble(Math::sqrt)
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

Hızlı Kontrol

Hangi senaryo paralel stream için en iyi adaydır?

Özet

Paralelliğin ne zaman yardımcı olduğunu öğrendiniz:

  • Yarar, N x Q ile birlikte artar (veri boyutu çarpı öğe başına maliyet).
  • Bölünebilir bir kaynak gerekir (diziler, ArrayList, aralıklar).
  • Ucuz ve birleşme özelliğine sahip bir birleştirme gerekir.
  • İşlemci sınırlı çalışmayı tercih edin, engelleyici G/Ç'den kaçının ve her zaman ölçüm yapın.
Başlamak ücretsiz

Yapay zeka eğitmeniyle Java öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
104
Dersler
374

Sıkça Sorulan Sorular

“Paralellik Ne Zaman Yararlıdır” dersi ücretsiz mi?

Evet — “Paralellik Ne Zaman Yararlıdır” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Paralellik Ne Zaman Yararlıdır” dersinde ne öğreneceğim?

İş yükü ve veri boyutu etkenleri Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Paralellik Ne Zaman Yararlıdır” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Paralel Akışlar Oluşturma
  2. Paralellik Ne Zaman Yararlıdır
  3. İş Parçacığı Güvenliği ve Yan Etkiler
  4. Yaygın Tuzaklar
← Java Academy Sayfasına Dön