並行流parallelstream注意事項
1、parallelstream是執行緒不安全的
2、parallelstream適用的場景是cpu密集型的,只是做到別浪費cpu,假如本身電腦cpu
的負載很大,那還到處用並行流,那並不能起到作用
3、i/o密集型 磁碟i/o、網路i/o都屬於i/o操作,這部分操作是較少消耗cpu資源,一般並
行流中不適用於i/o密集型的操作,就比如使用並流行進行大批量的訊息推送,涉及到了
大量i/o,使用並行流反而慢了很多
4、在使用並行流的時候是無法保證元素的順序的,也就是即使你用了同步集合也只能保
證元素都正確但無法保證其中的順序
解決並行流的執行緒安全問題:多執行緒下,使用並行流會有執行緒安全的問題
根據需要進行不同的處理:
1、使用同步**塊 synchronized (比如使用foreach迴圈處理時)
2、使用執行緒安全的集合 vector、collections.synchronizedlist(list)
3、呼叫stream流的 collect/toarray 方法
普通for迴圈、序列流、並行流在迴圈處理資料時效能對比:
測試**:
public
static
void
main
(string[
] args)
stopwatch stopwatch =
newstopwatch()
; stopwatch.
start()
;for
(int i =
0; i < list.
size()
;i ++)}
stopwatch.
stop()
; system.out.
println
("*****for===耗費:"
+stopwatch.
gettime()
);stopwatch.
reset()
; stopwatch.
start()
; list.
stream()
.filter
(x -
> x.
endswith
("0000000"))
.foreach
(a->);
stopwatch.
stop()
; system.out.
println
("*****stream===耗費:"
+stopwatch.
gettime()
);stopwatch.
reset()
; stopwatch.
start()
; list.
parallelstream()
.filter
(x -
> x.
endswith
("0000000"))
.foreach
(a->);
stopwatch.
stop()
; system.out.
println
("*****parallelstream===耗費:"
+stopwatch.
gettime());}
總結:修改上面**資料量的大小結果不同,
可以看到,序列化流在資料量很小的情況下,效能最差。而並行化流則處於波動的狀態。
所以單單從資料量上可以看出:
for迴圈的效能隨著資料量的增加效能也越來越差。
序列化流則在資料量小的情況下效能差,資料量中、大的時候效能略高於for迴圈,但當資料量特別大時,效能也變得越差。
並行化流受cpu核數的影響,在本機2核下,在資料量小的情況下效能略高於序列化流,略低於for迴圈,在資料量中的情況下差不多,在資料量比較大時效能最差,但當資料量特別大時,效能也變得更好。
如果想要使用parallelstream想提高效能,一定要根據實際情況做好測試,因為並行化的流效能不一定比序列化流效能高。
序列化與發序列化
1.序列化與反序列化都用的是相同的 binaryformatter bf new binaryformatter 2.使用 流 的方式 filestream fs new filestream 序列化內容路徑 一般為本地bin debug檔案中 類名.bin filemode.openorcreat...
序列化與反序列化
把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 eg stooges array moe larry curly new serialize stooges print r new echo print r unserial...
序列化與反序列化
序列化是將物件處理為位元組流以儲存物件或傳輸到記憶體 資料庫或檔案。其主要目的是儲存物件的狀態,以便可以在需要時重新建立物件。相反的過程稱為反序列化。通過序列化,開發人員可以儲存物件的狀態,並在需要時重新建立該物件,從而提供物件的儲存以及資料交換。通過序列化,開發人員還可以執行類似如下的操作 通過 ...