Apabila Keselarian Membantu
Faktor beban kerja dan saiz data
Apabila Keselarian Membantu ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Keselarian Ada Kos
Pelaksanaan secara selari menambah overhed: membahagikan data, mengagihkan tugas dan menggabungkan hasil. Ia hanya berbaloi apabila kos tersebut lebih kecil daripada masa yang dijimatkan.
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);
}
}Faktor 1: Saiz Data (N)
N yang besar menyebarkan overhed tetap keselarian. Panduan kasar ialah memerlukan puluhan ribu elemen sebelum pelaksanaan selari mula berbaloi.
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);
}
}Faktor 2: Kerja bagi Setiap Elemen (Q)
Kos Q untuk memproses setiap elemen adalah penting. Kerja yang mahal bagi setiap elemen (pengiraan berat) mendapat manfaat daripada keselarian walaupun dengan N yang lebih kecil.
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;
}
}Intuisi N Darab Q
Anggap jumlah kerja berguna sebagai N x Q. Semakin besar hasil darab itu, semakin banyak manfaat yang boleh diberikan oleh keselarian. N yang kecil atau Q yang remeh jarang membenarkannya.
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);
}
}Faktor 3: Kebolehan Membahagi
Sumber data yang boleh dibahagikan dengan murah dan sekata berfungsi dengan baik secara selari: tatasusunan, ArrayList dan IntStream.range. LinkedList dan sumber berasaskan iterator sukar dibahagikan.
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);
}
}Sumber Baik: Tatasusunan dan Julat
Julat primitif mempunyai saiz yang diketahui dan boleh dibahagikan dalam O(1), menjadikannya sumber selari yang ideal.
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);
}
}Sumber Lemah: Penjana Berlelaran
Stream.iterate menghasilkan elemen secara berjujukan mengikut takrifan, jadi ia tidak boleh dibahagikan sehingga elemen direalisasikan. Ia ialah sumber selari yang lemah.
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);
}
}Faktor 4: Langkah Cantuman Murah
Keselarian memerlukan cara yang murah untuk menggabungkan hasil separa. sum dan count digabungkan secara mudah; membina senarai tersusun atau menggunakan pengumpul yang banyak bergantung pada pepohon memerlukan cantuman yang mahal.
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);
}
}Elakkan Kerja Terikat Input/Output
Strim selari menyasarkan tugas yang terikat CPU pada kolam fork-join. Input/output yang menyekat menyebabkan kolam dikongsi mengalami kebuluran dan menjejaskan keseluruhan aplikasi. Sebaliknya, gunakan pelaksana khusus untuk input/output.
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);
}
}Ukur, Jangan Meneka
Satu-satunya cara yang boleh dipercayai untuk mengetahui sama ada keselarian membantu adalah dengan menjalankan penanda aras menggunakan data yang realistik. Gerak hati tentang prestasi sering kali tersasar.
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");
}
}Senarai Semak Praktikal
Utamakan pelaksanaan selari apabila semua syarat berikut dipenuhi:
- N besar dan/atau kerja yang mahal bagi setiap elemen.
- Sumber yang boleh dibahagi (tatasusunan, ArrayList, range).
- Cantuman yang murah dan asosiatif.
- Terikat CPU, tanpa input/output yang menyekat.
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);
}
}Semakan Pantas
Senario manakah yang paling sesuai untuk strim selari?
Imbas Kembali
Anda telah mempelajari keadaan yang membolehkan keselarian membantu:
- Manfaat meningkat mengikut N x Q (saiz data didarab dengan kos bagi setiap elemen).
- Memerlukan sumber yang boleh dibahagi (tatasusunan, ArrayList, julat).
- Memerlukan cantuman yang murah dan asosiatif.
- Pastikan kerja terikat CPU, elakkan input/output yang menyekat dan sentiasa ukur prestasi.
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Apabila Keselarian Membantu” percuma?
Ya — teks penuh “Apabila Keselarian Membantu” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Apabila Keselarian Membantu”?
Faktor beban kerja dan saiz data Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Apabila Keselarian Membantu” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mencipta Strim Selari
- Apabila Keselarian Membantu
- Keselamatan Thread dan Kesan Sampingan
- Perangkap Lazim