JavaRush /جاوا بلاگ /Random-SD /جاوا 8 ۾ صفن تي متوازي آپريشن - ترجمو
billybonce
سطح
Москва

جاوا 8 ۾ صفن تي متوازي آپريشن - ترجمو

گروپ ۾ شايع ٿيل
مضمون جو ترجمو
// Parallel Array Operations in Java 8 //Eric Bruno پاران، 25 مارچ 2014 ويب سائيٽ لاء ڊاڪٽر. ڊوب جو.
جاوا جو نئون رليز ان کي آسان بڻائي ٿو صفن سان متوازي سان رابطو ڪرڻ - نتيجي ۾ گهٽ ۾ گهٽ ڪوڊنگ سان ڪارڪردگي بهتر ٿي. هاڻي، Oracle جاري ڪري رهيو آهي Java SE 8 - جيڪو ٻولي جي لحاظ کان هڪ وڏو قدم آهي. ھن رليز جي ھڪ اھم خصوصيت آھي سڌريل سمورو، جن مان ڪجھ java.util.Arrays بيس ڪلاس ۾ نظر اچن ٿا. هن طبقي ۾ نوان طريقا شامل ڪيا ويا آهن، جن کي آئون هن مضمون ۾ بيان ڪندس. انهن مان ڪجهه JDK8 جي هڪ ٻي نئين خاصيت ۾ استعمال ڪيا ويا آهن - lambdas. پر اچو ته ڪاروبار ڏانهن وڃو.
Arrays.paralellSort()
parallelSort جون ڪيتريون ئي خاصيتون متوازي ضم ٿيل ترتيب واري الگورٿم تي ٻڌل آھن جيڪي بار بار ھڪڙي صف کي حصن ۾ ورهائي، انھن کي ترتيب ڏئي، ۽ پوءِ انھن کي ھڪ ئي وقت ھڪڙي آخري صف ۾ گڏ ڪري. ان کي استعمال ڪرڻ بدران موجوده، ترتيب وار Arrays.sort طريقو بهتر ڪارڪردگي ۽ ڪارڪردگي ۾ نتيجو آهي جڏهن وڏي صفن کي ترتيب ڏيو. مثال طور، هيٺ ڏنل ڪوڊ استعمال ڪري ٿو ترتيب وار ترتيب() ۽ متوازي parallelSort() ساڳي ڊيٽا جي ترتيب کي ترتيب ڏيڻ لاءِ: 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; } } ٽيسٽ ڪرڻ لاءِ، مون تصوير مان خام ڊيٽا کي صف ۾ لوڊ ڪيو، جنهن 46,083,360 بائيٽ ورتيون (۽ توهان جي تصويرن تي منحصر هوندو. جيڪو توهان استعمال ڪندا). منهنجي 4-ڪور ليپ ٽاپ تي ترتيب ترتيب ڏيڻ لاءِ ترتيب وار ترتيب وارو طريقو لڳ ڀڳ 3,000 مليسيڪنڊس ورتو، جڏهن ته متوازي ترتيب واري طريقي ۾ وڌ ۾ وڌ 700 مليسيڪنڊ لڳا. اتفاق ڪريو، اهو اڪثر نه ٿيندو آهي ته هڪ نئين ٻولي اپڊيٽ 4 ڀيرا ڪلاس ڪارڪردگي بهتر ڪري ٿي.
Arrays.parallelPrefix()
ParallelPrefix طريقو هڪ مخصوص رياضياتي فنڪشن کي لاڳو ڪري ٿو هڪ سر جي عناصر تي مجموعي طور تي، نتيجن کي پروسيسنگ ۾ صف اندر متوازي ۾. اهو جديد ملٽي-ڪور هارڊويئر تي تمام گهڻو ڪارائتو آهي، وڏين صفن تي ترتيب وار عملن جي مقابلي ۾. مختلف بنيادي قسمن جي ڊيٽا آپريشنز (مثال طور، IntBinaryOperator، DoubleBinaryOperator، LongBinaryOperator، وغيره) ۽ ان سان گڏو گڏ مختلف قسم جي رياضياتي آپريٽرن لاءِ ھن طريقي جا ڪيترائي نفاذ آھن. هتي هڪ مثال آهي متوازي سرن جي اسٽيڪنگ جو استعمال ڪندي ساڳي وڏي صف جي پوئين مثال وانگر، جيڪو منهنجي 4-ڪور ليپ ٽاپ تي اٽڪل 100 مليسيڪنڊن ۾ مڪمل ٿيو. 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() طريقو ھڪڙو صف ٺاھي ٿو ۽ ھر ھڪڙي عنصر کي ھڪڙي قدر تي مقرر ڪري ٿو فنڪشن جي مطابق جيڪو انھن قدرن کي پيدا ڪري ٿو، ڪارڪردگي کي بهتر ڪرڻ لاء متوازي استعمال ڪندي. اهو طريقو ليمبڊاس تي ٻڌل آهي (جنهن کي ٻين ٻولين ۾ "بندش" سڏيو ويندو آهي) (۽، ها، اها ليکڪ جي غلطي آهي، ڇاڪاڻ ته ليمبڊاس ۽ بندش مختلف شيون آهن) ، ۽ جيڪي JDK8 جي هڪ ٻي نئين خصوصيت آهن جيڪي اسان مستقبل جي مضمونن ۾ بحث ڪنداسين. اهو نوٽ ڪرڻ ڪافي هوندو ته ليمبڊاس، جنهن جي نحو کي -> آپريٽر جي ذريعي سڃاڻڻ آسان آهي، ساڄي پاسي کان هڪ آپريشن انجام ڏيو تير کان پوءِ سڀني عنصرن لاءِ ان ڏانهن گذريو. هيٺ ڏنل ڪوڊ مثال ۾، عمل صف ۾ هر عنصر لاءِ ڪيو ويندو آهي، ترتيب ڏنل i. Array.parallelSetAll() صف عناصر پيدا ڪري ٿي. مثال طور، ھيٺ ڏنل ڪوڊ ھڪڙي وڏي صف کي بي ترتيب انٽيجر جي قدرن سان ڀري ٿو: ھڪڙو public void createLargeArray() { Integer[] array = new Integer[1024*1024*4]; // 4M Arrays.parallelSetAll( array, i -> new Integer( new Random().nextInt())); } وڌيڪ پيچيده صف عنصر جنريٽر ٺاھڻ لاء (مثال طور، ھڪڙو جيڪو حقيقي دنيا جي سينسرز جي پڙھڻ جي بنياد تي قدر پيدا ڪري ٿو)، توھان استعمال ڪري سگھو ٿا ساڳيو ڪوڊ هيٺ ڏنل: 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(); } اسان getNextSensorValue سان شروع ڪنداسين، جيڪو حقيقت ۾، اهو سينسر کان پڇندو (مثال طور، هڪ ٿرماميٽر) ان جي موجوده قيمت واپس ڪرڻ لاء. هتي، مثال طور، هڪ بي ترتيب قيمت ٺاهي وئي آهي. هيٺ ڏنل CustomGenerator() طريقو توهان جي چونڊيل صورت جي بنياد تي چونڊيل منطق استعمال ڪندي عناصر جي هڪ صف ٺاهي ٿو. هتي هڪ ننڍڙو اضافو آهي، پر حقيقي ڪيسن لاء، اهو ڪجهه وڌيڪ پيچيده هوندو.
Spliterator ڇا آهي؟
Arrays ڪلاس ۾ هڪ ٻيو اضافو جيڪو concurrency ۽ lambdas جو استعمال ڪري ٿو Spliterator، جيڪو استعمال ڪيو ويندو آهي هڪ صف کي ٻيهر ڪرڻ ۽ ورهائڻ لاءِ. ان جو اثر صفن تائين محدود نه آهي - اهو پڻ ڪم ڪري ٿو ڪليڪشن ڪلاسز ۽ IO چينلز لاءِ. ورهائيندڙ پاڻمرادو هڪ صف کي مختلف حصن ۾ ورهائڻ سان ڪم ڪن ٿا، ۽ انهن جڙيل سبارين تي آپريشن ڪرڻ لاءِ هڪ نئون اسپليٽرٽر نصب ڪيو ويو آهي. ان جو نالو Iterator مان ٺهيل آهي، جيڪو ان جي حرڪت واري ڪم کي حصن ۾ ورهائي ٿو. اسان جي ساڳي ڊيٽا کي استعمال ڪندي، اسان پنھنجي صف تي ھڪڙي تقسيم عمل انجام ڏئي سگھون ٿا: ھن طريقي سان ڊيٽا تي عمل ڪرڻ سان متوازيت جو فائدو وٺندو آھي. توھان پڻ سيٽ ڪري سگھوٿا ورهائيندڙ پيرا ميٽرز، جھڙوڪ ھر ذيلي ذيلي ذيلي گھٽ ۾ گھٽ ماپ. 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... }
وهڪرو- پروسيسنگ
آخرڪار، هڪ آري مان، توهان هڪ اسٽريم اعتراض ٺاهي سگهو ٿا، جيڪو مجموعي طور تي ڊيٽا جي نموني تي متوازي پروسيسنگ جي اجازت ڏئي ٿو، عام طور تي هڪ وهڪرو ترتيب ۾. ڊيٽا جي گڏ ڪرڻ ۽ نئين JDK8 مان هڪ اسٽريم جي وچ ۾ فرق اهو آهي ته مجموعو توهان کي انفرادي طور تي عناصر سان ڪم ڪرڻ جي اجازت ڏئي ٿو جڏهن هڪ وهڪرو نه آهي. مثال طور، گڏ ڪرڻ سان، توھان عناصر شامل ڪري سگھو ٿا، انھن کي ختم ڪري سگھو ٿا، ۽ انھن کي وچ ۾ داخل ڪري سگھو ٿا. هڪ وهڪرو ترتيب توهان کي ڊيٽا سيٽ مان انفرادي عناصر کي هٿي ڏيڻ جي اجازت نٿو ڏئي، پر ان جي بدران توهان کي مڪمل طور تي ڊيٽا تي ڪم ڪرڻ جي اجازت ڏئي ٿي. توهان اهڙيون ڪارائتيون آپريشن ڪري سگهو ٿا جيئن هڪ سيٽ مان صرف مخصوص قدرن کي ڪڍڻ (ورپشن کي نظر انداز ڪرڻ)، ڊيٽا جي تبديليءَ جا عمل، گهٽ ۾ گهٽ ۽ وڌ ۾ وڌ صف کي ڳولڻ، نقشي جي گھٽتائي جا ڪم (استعمال ٿيل ڪمپيوٽنگ ۾)، ۽ ٻيا رياضياتي عمل. هيٺ ڏنل سادو مثال متوازي ۾ ڊيٽا جي هڪ صف کي پروسيس ڪرڻ ۽ عناصر کي گڏ ڪرڻ لاءِ اتفاق استعمال ڪري ٿو. public void streamProcessing() { int[] src = getData(); IntStream stream = Arrays.stream(src); int sum = stream.sum(); System.out.println("\nSum: " + sum); }
نتيجو
جاوا 8 ضرور ٻولي لاءِ سڀ کان وڌيڪ مفيد تازه ڪارين مان هڪ هوندو. هتي ذڪر ڪيل متوازي خاصيتون، ليمبڊاس، ۽ ٻيون ڪيتريون ئي واڌايون اسان جي سائيٽ تي جاوا 8 جي ٻين جائزي جو موضوع هونديون.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION