JavaRush /Blog Jawa /Random-JV /Operasi paralel ing array ing Jawa 8 - terjemahan
billybonce
tingkat
Москва

Operasi paralel ing array ing Jawa 8 - terjemahan

Diterbitake ing grup
terjemahan artikel
//Operasi Array Paralel ing Jawa 8 //Dening Eric Bruno, 25 Maret 2014 //drdobbs.com/jvm/parallel-array-operations-in-java-8/240166287 //Eric Bruno kerja ing sektor finansial lan blog kanggo situs web Dr. Dobb kang.
Rilis anyar Jawa nggampangake sesambungan karo array kanthi paralel - ngasilake kinerja sing luwih apik kanthi minimal kode. Saiki, Oracle ngeculake Java SE 8 - sing minangka langkah maju ing babagan basa. Salah siji fitur penting saka release iki apik concurrency, sawetara kang katon ing kelas dhasar java.util.Arrays. Cara anyar wis ditambahake ing kelas iki, sing bakal dakgambarake ing artikel iki. Sawetara iki digunakake ing fitur anyar liyane JDK8 - lambdas. Nanging ayo padha mudhun menyang bisnis.
Arrays.paralellSort()
Akeh fitur parallelSort adhedhasar algoritma ngurutake paralel sing misahake array dadi bagean, ngurutake, banjur gabungke maneh bebarengan dadi array pungkasan. Nggunakake tinimbang sing ana, cara Arrays.sort urutan asil ing kinerja apik lan efisiensi nalika ngurutake array gedhe. Contone, kode ing ngisor iki nggunakake urutan urut () lan parallelSort () kanggo ngurutake array data sing padha: public class ParallelSort { public static void main(String[] args) { ParallelSort mySort = new ParallelSort(); int[] src = null; System.out.println("\nSerial sort:"); src = mySort.getData(); mySort.sortIt(src, false); System.out.println("\nParallel sort:"); src = mySort.getData(); mySort.sortIt(src, true); } public void sortIt(int[] src, boolean parallel) { try { System.out.println("--Array size: " + src.length); long start = System.currentTimeMillis(); if ( parallel == true ) { Arrays.parallelSort(src); } else { Arrays.sort(src); } long end = System.currentTimeMillis(); System.out.println( "--Elapsed sort time: " + (end-start)); } catch ( Exception e ) { e.printStackTrace(); } } private int[] getData() { try { File file = new File("src/parallelsort/myimage.png"); BufferedImage image = ImageIO.read(file); int w = image.getWidth(); int h = image.getHeight(); int[] src = image.getRGB(0, 0, w, h, null, 0, w); int[] data = new int[src.length * 20]; for ( int i = 0; i < 20; i++ ) { System.arraycopy( src, 0, data, i*src.length, src.length); } return data; } catch ( Exception e ) { e.printStackTrace(); } return null; } } Kanggo nyoba, aku ngemot data mentah saka gambar menyang array, sing njupuk 46.083.360 bita (lan sampeyan bakal gumantung ing gambar. sing bakal digunakake). Cara ngurutake urutan njupuk meh 3,000 milliseconds kanggo ngurutake array ing laptop 4-inti, nalika cara ngurutake podo njupuk bab 700 milliseconds paling. Setuju, ora asring kedadeyan nganyari basa anyar nambah kinerja kelas kaping 4.
Arrays.parallelPrefix()
Cara parallelPrefix ngetrapake fungsi matematika sing ditemtokake kanggo unsur-unsur array kanthi bebarengan, ngolah asil ing array kanthi paralel. Iki luwih efisien ing hardware multi-inti modern, dibandhingake karo operasi sekuensial ing susunan gedhe. Ana akeh implementasine metode iki kanggo macem-macem jinis operasi data dhasar (contone, IntBinaryOperator, DoubleBinaryOperator, LongBinaryOperator, lan liya-liyane), uga kanggo macem-macem operator matematika. Iki minangka conto tumpukan paralel kanthi nggunakake array gedhe sing padha karo conto sadurunge, sing rampung ing babagan 100 milliseconds ing laptop 4-inti. public class MyIntOperator implements IntBinaryOperator { @Override public int applyAsInt(int left, int right) { return left+right; } } public void accumulate() { int[] src = null; // accumulate test System.out.println("\nParallel prefix:"); src = getData(); IntBinaryOperator op = new ParallelSort.MyIntOperator(); long start = System.currentTimeMillis(); Arrays.parallelPrefix(src, new MyIntOperator()); long end = System.currentTimeMillis(); System.out.println("--Elapsed sort time: " + (end-start)); } ... }
Arrays.parallelSetAll()
ParallelSetAll anyar () cara nggawe Uploaded lan nyetel saben unsur Uploaded kanggo Nilai miturut fungsi sing kui nilai, nggunakake podo kanggo nambah efficiency. Cara iki adhedhasar lambdas (disebut "penutupan" ing basa liya) (lan, ya, iki kesalahan penulis, amarga lambdas lan penutupan iku beda) , lan fitur anyar liyane JDK8 sing bakal kita bahas ing artikel sabanjure. Iku bakal cukup kanggo Wigati sing lambdas, kang sintaks gampang dikenali dening operator ->, nindakake operasi ing sisih tengen sawise panah kanggo kabeh unsur liwati. Ing conto kode ing ngisor iki, tumindak dileksanakake kanggo saben unsur ing Uploaded, indeks dening i. Array.parallelSetAll () ngasilake unsur Uploaded. Contone, kode ing ngisor iki ngisi array gedhe kanthi nilai integer acak: public void createLargeArray() { Integer[] array = new Integer[1024*1024*4]; // 4M Arrays.parallelSetAll( array, i -> new Integer( new Random().nextInt())); } Kanggo nggawe generator unsur array sing luwih kompleks (contone, sing bakal ngasilake nilai adhedhasar maca saka sensor donya nyata), sampeyan bisa nggunakake kode sing padha ing ngisor iki: public void createLargeArray() { Integer[] array = new Integer[1024*1024*4]; // 4M Arrays.parallelSetAll( array, i -> new Integer( customGenerator(getNextSensorValue()))); } public int customGenerator(int arg){ return arg + 1; // some fancy formula here... } public int getNextSensorValue() { // Just random for illustration return new Random().nextInt(); } Kita bakal miwiti karo getNextSensorValue, kang ing kasunyatan iku bakal takon sensor (Contone, thermometer) bali Nilai saiki. Ing kene, minangka conto, nilai acak digawe. Cara customGenerator () ing ngisor iki ngasilake macem-macem unsur nggunakake logika sing dipilih adhedhasar kasus sing sampeyan pilih. Iki minangka tambahan cilik, nanging kanggo kasus nyata, bakal dadi luwih rumit.
Apa Spliterator?
Kajaba iku, kelas Arrays sing nggunakake concurrency lan lambdas yaiku Spliterator, sing digunakake kanggo ngulang lan pamisah array. Efek kasebut ora diwatesi karo susunan - uga bisa digunakake kanggo kelas Koleksi lan saluran IO. Spliterators bisa kanthi otomatis pamisah Uploaded menyang macem-macem bagean, lan Spliterator anyar diinstal kanggo nindakake operasi ing subbarrays disambung iki. Jeneng kasebut digawe saka Iterator, sing "memotong" karya obah-iterasi dadi bagean. Nggunakake data sing padha, kita bisa nindakake tumindak pamisah ing larik kaya mangkene: Nindakake tumindak ing data kanthi cara iki njupuk kauntungan saka paralelisme. Sampeyan uga bisa nyetel paramèter pamisah, kayata ukuran minimal saben subarray. public void spliterate() { System.out.println("\nSpliterate:"); int[] src = getData(); Spliterator spliterator = Arrays.spliterator(src); spliterator.forEachRemaining( n -> action(n) ); } public void action(int value) { System.out.println("value:"+value); // Perform some real work on this data here... }
Stream - pangolahan
Pungkasan, saka Array, sampeyan bisa nggawe obyek Stream, sing ngidini pangolahan paralel ing sampel data sakabèhé, digeneralisasi dadi urutan stream. Bentenipun antarane Koleksi data lan Stream saka JDK8 anyar iku koleksi ngijini sampeyan kanggo bisa karo unsur individu nalika Stream ora. Contone, kanthi koleksi, sampeyan bisa nambah unsur, mbusak, lan lebokake ing tengah. Urutan Stream ora ngidini sampeyan ngapusi unsur individu saka set data, nanging ngidini sampeyan nindakake fungsi ing data kanthi sakabehe. Sampeyan bisa nindakake operasi sing migunani kayata ngekstrak mung nilai tartamtu (nglirwakake repetisi) saka set, operasi transformasi data, nemokake minimal lan maksimum array, fungsi ngurangi peta (digunakake ing komputasi sing disebarake), lan operasi matematika liyane. Conto prasaja ing ngisor iki nggunakake concurrency kanggo ngolah array data kanthi paralel lan jumlah unsur. public void streamProcessing() { int[] src = getData(); IntStream stream = Arrays.stream(src); int sum = stream.sum(); System.out.println("\nSum: " + sum); }
Kesimpulan
Java 8 mesthi bakal dadi salah sawijining nganyari paling migunani kanggo basa kasebut. Fitur paralel sing kasebut ing kene, lambdas, lan akeh ekstensi liyane bakal dadi subyek review Java 8 liyane ing situs kita.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION