摘要:當主機正在從某個輸入流源源不斷地讀取文件時,校驗碼的計算是實時的,每次校驗操作都只對文件的一部分進行處理。在計算校驗碼時,請至少使用的分區大小,否則調用會造成不可忽略的時間消耗。
原文:java.util.zip.CRC32 and java.util.zip.Adler32 performance
作者:Mikhail Vorontsov
校驗碼是把任意長度的字節內容輸入通過特定算法變換為一個長度較短的字節數組(在CRC32和Adler32中變換為整數(Integer))。校驗碼最主要的一個特點是,即使輸入內容發生了很小的變化,輸出內容也會有極為明顯的差別。校驗算法通常在以下兩種場景中使用:
當主機已經分別接收到一個完整文件和其對應的校驗碼時,我們要計算出整個文件的校驗碼,與接收到的校驗碼進行對比,來確認文件在傳輸的過程中沒有被篡改。
當主機正在從某個輸入流源源不斷地讀取文件時,校驗碼的計算是實時的,每次校驗操作都只對文件的一部分進行處理。當某些原因導致主機與輸入設備的連接斷開,主機嘗試重新傳輸時,我們會使用最后一次計算得到的校驗碼和讀取到的文件位置與當前重傳的數據內容進行比較,以免對前面已經傳輸過的數據進行重新處理,從而使得傳輸可以從當前位置繼續進行。
在標準JDK中,最常使用的校驗算法是java.util.zip.CRC32。許多開發者認為這是Java唯一的標準校驗算法實現(其中也有人會說這是標準的CRC(Cyclic Redundancy Check,循環冗余校驗)實現)。實際上,Java中還有另一種校驗算法叫java.util.zip.Adler32,這兩種算法都實現了同一個接口:java.util.zip.Checksum。
這兩種校驗算法是有區別的,Adler32比CRC32稍微弱一些,不過如果當需要校驗的內容長達幾千字節甚至更多時,你可以忽略校驗質量上的差異。更重要的是,Adler32的計算速度比CRC32快。下面的列表對這兩種校驗算法的處理速度進行了比較,處理的內容是一個500MB的存檔文件(文件已經預先讀取到內存中)
500MB數據容校驗速度對比
Adler32,一次性處理 | CRC32,一次性處理 | Adler32,每次處理區塊大小10 bytes | CRC32,每次處理區塊大小10 bytes | Adler32,每次處理區塊大小1000 bytes | CRC32,每次處理區塊大小1000 bytes | |
---|---|---|---|---|---|---|
Java 6 | 0.233 s | 1.526 s | 3.585 s | 4.119 s | 0.253 s | 1.545 s |
Java 7 | 0.227 s | 0.666 s | 3.684 s | 3.691 s | 0.267 s | 0.699 s |
如你所見,在Java 6中,當單次處理的區塊足夠大時,Adler32的速度是CRC32的5~6倍;而在Java 7中明確地對CRC32進行了性能優化,Adler32的速度只比CRC32快了2~3倍。使用小容量的區塊進行處理時,JNI調用的成本是影響速度的最大因素。
有人可能覺得0.3s和1.5s的時間差異對于500MB的內容來說沒有什么值得關注的地方,這并不完全正確。如今硬盤的讀取速度能達到100M/s,讀取500MB數據最多只需要5s,在這樣的情況下,額外的1秒時間(1.5-0.3 s)就會造成20%的性能下降。換個方式說,你可以理解為“我們的系統使用CRC32能達到500,000條信息/每秒的處理速度,而使用Adler32可以達到600,000條信息/每秒”。
總結如果你可以自由選擇校驗算法實現,你可以先嘗試使用Adler32。如果它的校驗質量對你來說已經足夠了的話,使用它比CRC32要更好。無論在什么情況下,你應當使用Checksum接口來訪問Adler32/CRC32的邏輯。
在計算校驗碼時,請至少使用500 bytes的分區大小,否則JNI調用會造成不可忽略的時間消耗。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68648.html
摘要:完整版地址我們的想法是創建一個深度學習框架的羅塞塔石碑假設你很了解某個深度學習框架,你就可以幫助別人使用任何框架。我們的目標是創建深度學習框架的羅塞塔石碑,使數據科學家能夠在不同框架之間輕松運用專業知識。 repo 1.0 完整版 GitHub 地址:https://github.com/ilkarman/DeepLearningFrameworks我們的想法是創建一個深度學習框架的羅塞塔石...
摘要:在本文中我將會介紹應用性能優化的一般原則。性能優化的流程圖摘取自和合著的性能,描述了應用性能優化的處理流程。例如,對每臺服務器,你面臨著為單個分配堆內存和運行個并為每個分配堆內存的選擇。不過位能使用堆內存最大理論值只有。 原文鏈接:http://www.cubrid.org/blog/dev-platform/the-principles-of-java-application-per...
摘要:機型機型云主機根據應用場景將主機區分為快杰型通用型高主頻型型總計種機型。若希望使用現有鏡像創建快杰型云主機,請聯系技術支持。不同平臺的云主機價格相同。此文檔適合于2019年5月后新上線的新版主機創建頁,重新定義了大部分機型的概念,這些新概念被聚合為主機機型概念2.0。若您仍然使用舊版本的主機創建頁,機型概念請參照主機概念1.0的文檔機型與規格;若您希望了解2.0概念與1.0概念相比發生了哪些...
摘要:注意年月上線新版主機創建頁后,主機機型概念已升級到版本。請參照機型與平臺機型與平臺進行選型。以下為版主機概念的文檔規格族簡述規格族簡述云主機根據應用場景將主機區分為標準型高型高主頻型型總計種規格族,并支持總計個系列的種機型。注意:2019年5月上線新版主機創建頁后,主機機型概念已升級到2.0版本。此文檔描述的1.0版本概念將不再沿用。請參照?機型與CPU平臺?進行選型。控制臺列表展示的機型也...
閱讀 1960·2021-09-04 16:45
閱讀 747·2019-08-30 15:44
閱讀 893·2019-08-30 13:07
閱讀 456·2019-08-29 16:06
閱讀 1375·2019-08-29 13:43
閱讀 1269·2019-08-26 17:00
閱讀 1526·2019-08-26 13:51
閱讀 2294·2019-08-26 11:48