1. 程式人生 > >並行流計算--統計1-n的和,計算密集型

並行流計算--統計1-n的和,計算密集型

import java.util.function.Function;
import java.util.stream.LongStream;
import java.util.stream.Stream;

public class ParalleStreamDemo {
	
	public static long parallelSum(long n) {
		return Stream.iterate(1L, i -> i+1)
				.limit(n)
				.parallel()
				.reduce(0L, Long::sum);
	}
	
	public static long sequenceSum(long n) {
		return Stream.iterate(1L, i -> i+1)
				.limit(n)
				.reduce(0L, Long::sum);
	}
	
	public static long iterativeSum(long n) {
		long result = 0;
		for(int i = 0; i < n; i++) {
			result =+ i;
		}
		return result;
	}
	
	public static long parallelSum2(long n) {
		return LongStream.rangeClosed(0, n).parallel().reduce(0, Long::sum);
	}
	
	public static long sequenceSum2(long n) {
		return LongStream.rangeClosed(0, n).reduce(0, Long::sum);
	}
	
	public static long test(Function<Long, Long> computer, long n) {
		long fastest = Long.MAX_VALUE;
		for(int i = 0; i < 100; i++) {
			long start = System.currentTimeMillis();
			computer.apply(n);
			long cost = System.currentTimeMillis() - start;
			if( cost < fastest) {
				fastest = cost;
			}
		}
		return fastest;
	}
	
	public static void run1(long n) {
		System.out.println("順行流"+test(ParalleStreamDemo::sequenceSum, n));
		System.out.println("並行流"+test(ParalleStreamDemo::parallelSum, n));
		System.out.println("迭代"+test(ParalleStreamDemo::iterativeSum, n));
	}
	
	public static void run2(long n) {
		System.out.println("順行流2"+test(ParalleStreamDemo::sequenceSum2, n));
		System.out.println("並行流2"+test(ParalleStreamDemo::parallelSum2, n));
		System.out.println("迭代2"+test(ParalleStreamDemo::iterativeSum, n));
	}
	public static void main(String[] args) {
		long n = 20_000_000;
		run1(n);
		run2(n);
	}
}

run1執行結果:

順行流174
並行流628

迭代13

分析:

1.iterate很難分成獨立的小塊,它每一次呼叫函式都依賴上一次的結果,整個數字列表最初計算的時候還沒準1備好。它使用的是連結串列,而非陣列。
2.java8在java7的分支合併框架的基礎上打造。

3.iterate方法它生成的東西是裝箱物件Long,需要再拆箱。

正確使用並行流:

順行流29
並行流24

迭代213

並行過程本身需要對每個過程做地域劃分,把每個子流的歸納操作分配給不同的執行緒,然後合併成一個值,這些jdk背後做的。再多個核心直接移動資料的代價是比較大的。所以我們要保證再一個核心中執行的時間要大於核心間傳遞資料的時間。

相關推薦

並行計算--統計1-n計算密集型

import java.util.function.Function; import java.util.stream.LongStream; import java.util.stream.Stream; public class ParalleStreamDemo {

shell計算指定行的計算指定列的

如何 指定 for shel int ++ body 文本文 col 有一個文本文件,裏面某行某列為數字,那麽如何用shell計算指定行(列)的和,方法如下 計算指定行的和: awk ‘NR==3{for(i=1;i<=NF;i++)sum=sum+$i;}EN

輸入一個數n程式設計計算輸出1-n之間的所有素數之和

#include<stdio.h> int main() { int n,i,j,t,l; int sum=0; printf("請輸入一個大於2的整數:"); scanf("%d",&n); l=n;

通過程式設計實現統計1-n有多少個9

#include <stdio.h> int main() {     int n,a,i,j;     int sum = 0;     printf("please input n:\n");     scanf("%d",&n); for(i=1;

給一個正整數n計算1-n中出現1的次數

con 個數字 優化 個數 數字 higher 通過 需要 出現的次數 如12出現1的次數為5,分別是:1,10,11,12 一般做法:從1-n遍歷,計算每一個數中每一位出現1的次數 function count(num){ var n=0;

求解多邊形面積2S= Σ【Xi (Yi+1-Yi-1)】,(i屬於1~n公式解析及編程實現

poi logs 驗證 地圖 class view hide 對比 turn yogurt今天要個大家分享一個基礎的二維空間多邊形面積求算方法,主要也是為了下一篇《橢球體上某區域面積的求算,及Albers投影與墨卡托投影後該區域面積對比》打一個基礎。關於投影的相關過

設任意n個整數存放於陣列A[1..n]中試編寫演算法將所有正數排在所有負數前面(要求:演算法時間複雜度為O(n))。

注意陣列的實際長度 #include <iostream> using namespace std; void sort(int A[],int n) { int i=0;//陣列的頭下標 int j,x; j=n-1;//陣列的尾下標 while

統計1-n1 的次數

package offer; /** * @Package Name : ${PACKAG_NAME} * @Creation Date : 2018年12月27日上午7:19 * @Function : todo */ public class calculate_1_count {

n 個人圍成一圈(編號1-n數到3的出列最後剩下的人的編號

問題: n 個人圍成一圈(編號1-n),數到3的出列,然後又從頭開始數,一直迴圈到最後一個人,請問最後剩下的人的編號? public int numberToExit(int total, int interval) { boolean[] arr = new bool

1.通過程式設計實現,統計1~n有多少個9

#include <stdio.h> int main() { int n,m,k; int i,j=0; printf(“enter n:”); scanf(%d",$n); for(i=1;i<=n,i++) { k=i; while(k)

通過程式設計實現,統計1~n有多少個9 提示:n通過引數傳入

#include <stdio.h> int fun(int n) { int i; int tmp; int k; int count = 0;

.通過程式設計實現,統計1~n有多少個9 (n通過引數傳入)

 #include<stdio.h> int count9(int n) {         int i,r,temp;         int j=0;         for(i=

每日訓練之程式設計小程式 1統計1~n有多少個9 (註釋已補)

        在經過一段時間的預習之後,開始了這個學期的第一次程式設計,在正式寫上程式之前,先分析下我的思路。        在剛開始的時候,是想法上的錯誤,誤把題目理解為了求1~n有多少個9的倍數,導致結果出現偏差。        後來我準備通過對每個數先從個位開始檢測是

1. 題目:通過程式設計實現,統計1~n有多少個9 提示:n通過引數傳入

/*題目:通過程式設計實現,統計1~n有多少個9  提示:n通過引數傳入*/ #include <stdio.h> int main() {int n;printf("璇瘋緭鍏鐨勫€礆細\n");scanf("%d",&n);int i = 1,cou

計算幾何 ( 求凸包計算三角形面積 )——最大三角形 ( HDU 2202 )

1.求凸包: int cmp(point a, point b) //水平排序 { if(a.x==b.x)return a.y<b.y; return a.x

使用遞迴函式計算1+2+3+……+n

#for迴圈 n = int(input('請輸入一個正整數:')) sum = 0 for i in range(n + 1): sum += i print(sum) #遞迴呼叫 n = int(input('請輸入一個正整數:')) def Sum(n): if n

假設狗一年1第3年第5年個生出一條小狗第六年死亡計算n年狗的個數(不考慮公母)

2種演算法 先定義一個狗的class class Dog: year = 1 def is_dead(self): return True if self.year >= 6 else False def add(self):