<noframes id="llnpn"><pre id="llnpn"><strike id="llnpn"></strike></pre><address id="llnpn"><strike id="llnpn"><span id="llnpn"></span></strike></address>

<pre id="llnpn"></pre>

    <address id="llnpn"><strike id="llnpn"><span id="llnpn"></span></strike></address>

    <noframes id="llnpn">

      <noframes id="llnpn"><pre id="llnpn"></pre>
      • 自動秒收錄
      • 軟件:1973
      • 資訊:56157|
      • 收錄網站:175404|

      IT精英團

      創建Go語言最快的排序算法

      創建Go語言最快的排序算法

      瀏覽次數:
      評論次數:
      編輯: 樂詠
      信息來源: ITPUB
      更新日期: 2022-05-07 18:32:21
      摘要

      前言說到排序算法,很多同學會想起快速排序、堆排序、冒泡排序這些耳熟能詳的算法。了解得深一些的同學,也可能看過例如Python的timsort以及C++introsort之類的排序算法。

      • 正文開始
      • 相關閱讀
      • 推薦作品

      前言

      說到排序算法,很多同學會想到快速排序、堆排序、冒泡排序等熟悉的算法。比較了解的同學可能也見過Python的timsort、SinoSort等排序算法。

      但是我們也有很多疑問,比如Go語言中使用的快速排序和我們書本上學到的快速排序有什么區別?如果我們自己寫一個快線,會比Go語言本身快嗎?排序算法領域有什么最新進展?有什么算法是最快的?

      本文將介紹字節跳動-語言團隊's在Go語言中排序算法的實踐。我們使用通用版本的pdqsort算法Go1.18,并實現了一個在幾乎所有情況下都比標準庫API快 2x ~ 60x的算法庫。

      此項改動已經被社區采納合并進入 Go runtime 當中,作為默認的不穩定排序算法,有望在Go 1.19中與大家見面,其中非泛型版本位于標準庫排序,泛型版本位于exp/slices。

      提案: https://github.com/golang/go/issues/50154

      臨時項目地址:https://github.com/zhangyunhao116/pdqsort

      簡介

      Go,Rust,C默認的不穩定排序算法名為quicksort,但本質是混合排序算法。雖然他們在大多數情況下會使用快速排序,但在不同的情況下也會切換到其他排序算法。

      不穩定排序算法是指在排序過程中,值相等的元素可能會互相交換位置。

      一般來說,常見的混合排序算法在元素較少的序列中會切換到插入排序(該值一般為16 ~ 32)。雖然插入排序的時間復雜度為O (n 2),但在元素較少的情況下,其性能基本上超越了其他排序算法,因此常被用于混合排序算法中。

      在其他情況下,默認使用快速排序。但是快速排序在某些情況下可能會達到最壞的時間復雜度O(n ^ 2),這是因為pivot選擇的問題(有些序列pivot選擇不好,導致性能快速下降)。為了保證快速排序的最壞情況,我們的時間復雜度仍然是O(n* logn)。大多數混合排序算法在某些情況下會轉向堆排序,因為堆排序在最壞情況下的時間復雜度仍能保持O(n* logn)。

      總之,目前流行的不穩定排序算法,基本上都是針對不同的情況采用不同的方式進行排序,以達到最優解。我們今天介紹的pdqsort也是這種思想的延伸。

      先驗知識

      介紹了一些常見的基本排序算法及其特點。

      快速排序(經典)

      平均情況:O(n*logn) Bad-case:O(n^2)

      經典的快速排序主要采用分而治之的思想。具體過程是通過選擇一個支點(錨點),將一個數組劃分為不同的子數組。選擇一個樞軸后,該數組中樞軸左側的元素都小于樞軸,樞軸右側的元素都大于樞軸。因此,在樞軸的兩側形成兩個子陣列,然后對這些子陣列進行相同的操作(選擇樞軸,然后進行分割)。當一個子數組只有一個元素時,它是有序的,然后它可以退出循環。如此反復,最后得出整體順序。

      我們可以觀察到經典快速排序的主要過程是兩個步驟:

      選擇pivot:選擇一個透視。

      Partition:使用pivot對數組進行分區。

      一般來說,快速分揀性能的關鍵在于pivot,的選擇,而支點的選擇直接決定了分揀的速度。

      ,如果每次 pivot 都被選定為真正的 median(中位數),此時快排的效率是最高的。因此 pivot 的選擇重點在于尋找 array 真正的 median,目前所有的 pivot 選擇方案都是在尋找一個近似的 median。

      為什么 pivot 選定為中位數使得快排效率最高?

      詳細解釋可以參考:https://en.wikipedia.org/wiki/Quicksort#Formal_analysis。簡單來說,pivot 如果選定為中位數,則大部分情況下每次 partition 都會形成兩個長度基本相同的 sub-arrays,我們只需要 logn 次 partition 就可以使得 array 完全有序,此時時間復雜度為 O(n* logn)。在最壞情況下,我們需要 n-1 次 partition (每次將長度為 L 的 array 分為長度為 1 和 L - 1 的兩個 sub-arrays)才能使得 array 有序,此時時間復雜度為 O(n^2)。

      我們為何不直接尋找 array 真正的 median?

      原因是因為 array 的長度太長的話,尋找真正的 median 是一個非常昂貴的操作(需要存儲所有的 items),相比于尋找一個近似的 median 作為 pivot 會消耗更多的資源,如果找到正確 median 的消耗比使用一個近似 median 高的話,這就是一個負優化。折中的方案就是使用一個高性能的近似 median 選擇方案。

      基本所有針對 quicksort 的改進方案,都是通過改造這兩步得到的,例如第一步可以使用多種不同的 pivot 選擇方案(見附錄),第二步則有諸如 BlockQuickSort 這樣通過減少分支預測來提升性能的方案。

      Insertion sort

      插入排序的主要想法是,每一次將一個待排序的元素插入到前方已經排序好的序列中,直到插入所有元素。盡管其平均時間復雜度高達 O(n^2),但是在 array 長度較短(這個值一般是 16 ~ 32)的情況下,在實際應用中擁有良好的性能表現。

      Heap sort

      堆排序是利用堆結構設計出來的一種排序算法。這個算法有一個非常重要的特性,其在最壞情況下的時間復雜度仍然為 O(n* logn)。故而很多混合排序算法利用了這一特性,將堆排序作為 fall back 的排序算法,使得混合排序算法在最壞情況下的理論時間復雜度仍然為 O(n* logn)。

      pdqsort (pattern-defeating quicksort)

      論文地址:https://arxiv.org/pdf/2106.05123.pdf

      pdqsort (pattern-defating quicksort) 是 Rust、C++ Boost 中默認的 unstable 排序算法,其實質為一種混合排序算法,會在不同情況下切換到不同的排序機制,是 C++ 標準庫算法 introsort 的一種改進??梢哉J為是 unstable 混合排序算法的較新成果。

      其理想情況下的時間復雜度為 O(n),最壞情況下的時間復雜度為 O(n* logn),不需要額外的空間。

      pdqsort 的主要改進在于,其對 common cases (常見的情況)做了特殊優化。因此在這些情況下性能超越了之前算法,并且相比 introsort 在隨機序列的排序性能基本保持了一致。例如當序列本身有序、完全逆序、基本有序這些情況下都超越了大部分算法。其主要的思想是,不斷判定目前的序列情況,然后使用不同的方式和路徑達到最優解。

      這里的算法細節描述的是 https://github.com/zhangyunhao116/pdqsort 中的實踐,其大致相當于論文中的 PDQ 算法(沒有來自 BlockQuickSort 的優化),并且加入了一些參數調整以及借鑒了部分其他 pdqsort 的實踐優化。

      注意,不同 pdqsort 實踐中會有一些細微差異(因為語言以及接口的關系),不過其總體思想是一致的。

      pdqsort C++ 版本性能對比,位于 https://github.com/orlp/pdqsort

      整體流程

      為了更好地解析 pdqsort 算法,我們先來描述下其主要流程。pdqsort 就是下面三種情況的不斷循環,根據序列長度以及是否是最壞情況,每個 array 都會使用下面三種方法之一進行排序(有優先級,盡可能使用排在前面的方式

      1. 短序列情況,對于長度在 [0, MAX_INSERTION] 的輸入,使用 insertion sort (插入排序)來進行排序后直接返回,這里的 MAX_INSERTION 我們在 Go 語言下的性能測試,選定為 24。
      2. 最壞情況,如果發現改進的 quicksort 效果不佳(limit== 0),則后續排序都使用 heap sort 來保證最壞情況時間復雜度為 O(n*logn)。
      3. 正常情況,對于其他輸入,使用改進的 quicksort 來排序,這里的算法分幾步,后續內容會詳細介紹部分步驟。

      圖中淺黃色虛線框代表此步驟為可選項,即算法會根據情況(以下變量)來決定是否執行。

      下列變量代表 pdqsort 進行本次循環排序的情況,用于幫助算法來猜測需要排序的 array 的狀態,來決定某些步驟是否需要進行

      • wasBalanced: Bool, 代表上次 partition 是否平衡。在 pivot 和真正的 median 很接近時我們認為是平衡的(true),此變量可以用 partition 后的 pivot index 同 array 兩端的距離來判定。
      • wasPartitioned: Bool, 如果為真,則代表上次 partition 沒有交換任何元素(即上次 partition 分割的是一個本身已經有序的 array)。
      • limit: int,如果為 0,則后續對 unsorted array 的排序都會使用 heap sort 而不是 quick sort。這種情況發生在 quicksort 有很多次選擇的 pivot 和真正的 median 差距很大,從而導致 partition 后的兩個 sub-arrays 長度相差較大的場景中。limit的初始值是根據待排序 array 的長度計算出來的,每次發現快排策略效果不佳時,即 !wasBalanced為真,則使得 limit減小 1。

      3-1. 應對可能的最壞情況,即實現中的breakPatterns。此時會判斷 wasBalanced 是否為 true,如果不平衡(false),則隨機交換幾個元素,破壞一些可能造成 pivot 與 median 相差較大的特殊情況。

      3-2. pivot 的選擇,即實現中的 choosePivot。函數同時返回兩個值,pivotidx 和 likelySorted,前者是 pivot 在此 array 的 index(索引),后者代表著選擇 pivot 的過程中,是否可以大概率認定這個 array 已經為有序。

      3-3. 應對幾乎有序的情況,即實現中的 partialInsertionSort。如果 wasBalanced && wasPartitioned && likelySorted為 true,則代表此 array 有非常大的可能是一個有序序列。此時我們使用 partial insertion sort 的排序算法,其原理和 insertion sort 大致相當,只是多了一個嘗試次數,即只會對有限的元素進行插入排序,增加這個限制是為了避免猜測錯誤導致消耗大量時間。如果達到嘗試次數時 array 仍未有序,則退出。如果在嘗試次數之前發現所有元素有序,則可以直接返回。

      3-4. 應對重復元素較多的情況,即實現中的 partitionEqual。如果 pred 存在,并且和本次選中的 pivot 值相等(pred 是之前 array 的 pivot,即目前 array 中的最小值,因為與 pivot 重復的元素只可能出現在 partition 后的兩個 sub-arrays 其中之一),說明重復元素很可能較多,則調用 partitionEqual然后繼續進行下次循環,使用這種方法將重復元素提前放到一起,因為多次選定重復元素作為 pivot 會使得 partition 的效率較低。

      3-5. partition,使用 pivot 來分割 array,即實現中 partition。此函數和一般快排的 partition 相比基本相同,區別在于其會檢測序列是否本身就是有序的(即 partition 時沒有交換任何元素)。

      實現細節

      breakPatterns (3-1)

      這一步的作用是解決一些會導致現有 pivot 選擇方案表現很差的情況,所以當上次 partition 的 pivot 選擇不好時(表現為最終 pivot 的位置離 array 兩端之一很近),此時會隨機交換幾個元素來避免一些極端情況。同時,此步驟還會將 limit減去 1,說明上次 pivot 的選取方案不夠好(當 limit為 0 時使用 heapsort 而不是快排方案來進行排序)。

      pivot 選擇 (3-2)

      附錄中有關于 pivot 選擇方案的詳細介紹。

      假設 array 的長度為 L,SHORTEST_MEDIAN_OF_MEDIANS 值為 50。這里根據長度分為三種情況:

      1. L 位于 [0,8): 直接取固定值作為 pivot,即 L/4 * 2
      2. L 位于 [8,SHORTEST_MEDIAN_OF_MEDIANS): 使用 medians of three 方法采樣 3 個元素篩選 pivot,即 L/4* 1 L/4* 2 L/4* 3 的中間值
      3. L 位于 [SHORTEST_MEDIAN_OF_MEDIANS, ∞): 使用 Tukey’s median of medians 采樣 9 個元素得到一個近似中間值

      此方法還會判斷這個 array 是否很可能已經有序,例如當第三種情況時,如果發現 a a-1 a+1 這三個值中,a 恰好是中間值(b,c 也同樣如此),則說明元素在這些地方都局部有序,所以這個 array 很可能是已經有序的。如果每次都發現,a a-1 a+1 這三個值都是逆序排列(b,c 也同樣如此),則說明元素在這些地方都局部逆序,整個 array 很可能是完全逆序的。此時的策略是將整個 array 翻轉,這樣有很大概率使得整個 array 幾乎有序。

      Go 語言環境下的實踐考量

      Go 1.18 泛型對于排序算法的影響

      Go 1.18 的泛型在這種情況下有較大的性能提升并且增加了可維護性,同樣的算法在經過泛型改造后能得到 2x的性能提升。這一點我們通過觀察 pdqsort 泛型版本,以及 pdqsort (with sort.Interface) 的版本性能對比可以觀察出來。

      在可維護性方面,通過泛型的類型約束抽象了所有可比對的基本類型,不需要使用復雜的代碼生成技術。

      在性能方面,泛型由于有了類型參數,可以在編譯期生成大量代碼,免去了使用 sort.Interface帶來的抽象開銷。

      pdqsort 相比于 Go 原有算法的優勢

      在純粹的算法層面,即 pdqsort (with sort.Interface) ,pdqsort 在完全隨機的情況下和原有算法(類似于 IntroSort)性能幾乎一致(非泛型版本,因為需要兼容 sort.Interface)。在常見的場景下(例如序列有序|幾乎有序|逆序|幾乎逆序|重復元素較多)等情況下,會比原有的算法快 1 ~ 30倍。

      因此,我們同樣向 Go 官方提議將 pdqsort 應用在 sort.Sort 中,相關的 issue 討論位于:https://github.com/golang/go/issues/50154

      Go 原有的算法類似于 introsort,其通過遞歸次數來決定是否切換到 fall back 算法,而 pdqsort 使用了另一種計算方式(基于序列長度),使得切換到 fall back 算法的時機更加合理。

      為什么禁用來自 BlockQuickSort 的優化

      因為 BlockQuickSort 的優化基本來自減少分支預測,原理是在 partition 一個長序列的時候,先存儲需要交換的元素,后續統一放到真正的序列中。經過實際性能測試,發現這一優化在 Go 上并不成立,甚至是一個負優化。原因可能由于 Go 是一門 heap-allocate 的語言,對于此類優化并不敏感。并且對于減少分支預測,Go 的編譯器在某些情況下并不能優化到相應指令(CMOV)。

      總結

      目前大部分工業界使用的 unstable 排序算法,基本上都從過去教科書中單一的排序算法轉變成混合排序算法,來應對實踐場景中各式各樣的序列。

      pdqsort 依靠其在常見場景相比之前算法的性能優勢,逐漸成為 unstable 排序算法的主流實現?;?Go1.18 帶來的泛型,使得排序算法的實現被大大簡化,也給予了我們實現新算法的可能。但是 pdqsort 也不是萬能靈藥,在某些情況下,其他的算法依然保持著優勢(例如 Python 標準庫的 timsort 在混合升序&&降序的場景優于 pdqsort)。不過在大部分情況下,pdqsort 依靠其對于不同情況的特定優化,成為了 unstable 算法較好的選擇。

      附錄

      quicksort pivot 方案對比

      這里簡單介紹不同的 pivot 選擇方案。最好的 pivot 選擇方案就是使用一個高性能的近似 median 選擇方案,在準確度和性能上達到平衡。假設我們需要排序的元素為 [4,3,2,1],我們需要將其排列為升序,即 [1,2,3,4]。

      選擇首個元素

      這是我們實現快排時最簡單的方法,即選取 array 的首個元素作為 pivot。

      • [4,3,2,1]。選定 4 為 pivot,由于左邊沒有元素,所以會從最右邊開始找,找到第一個比 4 小的元素,即 1 作交換。
      • [1,3,2,4]。選定 1 為 pivot,同理。希望從右邊找到第一個比 1 小的元素,由于 1 已經是最小的值,此輪不會交換任何元素。
      • [1,3,2,4]。選定 3 為 pivot,同理。將 2 和 3 互換。
      • [1,2,3,4]。得到結果。

      可以看到,選擇首個元素的方式在 array 為逆序的情況下,每輪 partition 只將問題的規模減小了 1,即每次只能確定一個元素的最終位置。這種簡單的方法在面對極端情況時效果并不好,在完全逆序的情況下達到了快排的最壞情況。

      median of three

      這個方法是分別取最左邊、最右邊、中間三個值,然后選出其中間值作為 pivot。例如 [4,3,2,1],我們會選取 4 3 1然后選擇其中的 3作為 pivot。這種方式相比于首個元素的方式會更加合理,因為采樣了多個元素,不容易受到一些極端情況的影響,往往會比首個元素的方式有更好的效果。

      stackoverflow discussion:

      https://stackoverflow.com/questions/7559608/median-of-three-values-strategy

      median of medians

      這個方法的原理其實和 median of three 相似,不同的地方在于加大了 pivot 的采樣范圍,在 array 長度較長的情況下理論表現會更好。其采樣步驟是先將 array 分為 n/5 個 sub-arrays,n 為 array 的長度。然后將這些 sub-arrays 的 medians 都取出,選取這些 medians 中的 median,同樣的方式如此反復,最后得到一個 median of medians 作為最后的 pivot。

      stackoverflow discussion:

      https://stackoverflow.com/questions/5605916/quick-sort-median-selection

      Median-finding Algorithm:

      https://brilliant.org/wiki/median-finding-algorithm/#citation-1

      John Tukey’s median of medians

      此方法其實是 median of three 的改進,我們在 median of three 會取三個元素,而 Tukey’s median of medians 會取三個元素及其相鄰兩個元素的 median(例如 median of three 取了 a,b,c 則此方案會選擇 a-1 a a+1 取這三個值的 median),然后再取這個三個 medians 的 median。即此方案會采樣其中 9 個元素,相比于 median of three 多了三倍的采樣率,所以此方法也叫做 Tukey’s ninther。

      See

      https://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/

      MySQL 8.0如何創建規范表
      ? 上一篇 2022-05-06
      采訪者:告訴我們SpringAOP的底層代理模型
      下一篇 ? 2022-05-07
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • 7 種提升Spring Boot吞吐量神技!
        0閱讀 0條評論 個贊
        一、異步執行實現方式二種:1.使用異步注解@aysnc、啟動類:添加@EnableAsync注解2.JDK8本身有一個非常好用的Future類——CompletableFuture@AllArg……
      • 做SQL性能優化真的是干瞪眼
        1閱讀 0條評論 個贊
        很多大數據計算都是用SQL實現的,跑得慢時就要去優化SQL,但常常碰到讓人干瞪眼的情況。比如,存儲過程中有三條大概形如這樣的語句執行得很慢:selecta,b,sum(x)fromTgr……
      • Java“年度加密漏洞”修復 網友:更多堅持Java 8的理由
        9閱讀 0條評論 個贊
        文|Travis出品|OSC開源社區(ID:oschina2013)甲骨文于昨日推送了安全更新修復了一個漏洞,該漏洞允許攻擊者偽造某些種類的SSL證書和握手、雙因素認證信息,以及由一系列廣……
      • 如何正確計算Kubernetes容器的CPU利用率
        1閱讀 0條評論 個贊
        本文轉自博客園,原文:https://www.cnblogs.com/apink/p/15767687.html,版權歸原作者所有。參數解釋使用Prometheus配置kubernetes環境……
      • 透徹理解數據資產、數據資源、數據管理、數據治理等概念的區別
        1閱讀 0條評論 個贊
        以下文章來源于公眾號-大魚的數據人生,作者討厭的大魚先生數據成為生產要素后,各種跟數據相關的概念就出來了,其實很多概念沒有權威定義,大家各有各的理解,這導致了理解上的歧義。數據管理、數據治理、數據資源……
      • MySQL批量插入數據 一次插入多少行數據效率最高?
        7閱讀 0條評論 個贊
        一、前言我們在操作大型數據表或者日志文件的時候經常會需要寫入數據到數據庫,那么最合適的方案就是數據庫的批量插入。只是我們在執行批量操作的時候,一次插入多少數據才合適呢?假如需要插入的數據有百萬條,那……
      • 創建Go語言最快的排序算法
        1閱讀 0條評論 個贊
        前言說到排序算法,很多同學會想起快速排序、堆排序、冒泡排序這些耳熟能詳的算法。了解得深一些的同學,也可能看過例如Python的timsort以及C++introsort之類的排序算法?!?/div>
      • MySQL的行格式是什么?
        0閱讀 0條評論 個贊
        行格式(rowformat)決定了我們插入的一行數據,是如何存儲在數據庫中的,MySQL有4種行格式,分別是REDUNDANT,COMPACT,DYNAMIC,COMPRESSED。不同行格式區別:……
      • Spring云應用的優雅下線和灰度發布
        2閱讀 0條評論 個贊
        前言在生產環境中,如何保證在服務升級的時候,不影響用戶的體驗,這個是一個非常重要的問題。如果在我們升級服務的時候,會造成一段時間內的服務不可用,這就是不夠優雅的。那什么是優雅的呢?主要就是指在服務升級……
      • MYSQL如果索引優化僅僅是添加索引 太年輕而不簡單
        0閱讀 0條評論 個贊
        MYSQL的索引優化,如果此時此刻看到索引的優化,僅僅想到添加適合的索引,是不完全的,索引的優化本身就具有很多的不確定性。1索引會隨著時間的推移,有性能的衰減2索引會隨著數據量的增加,有性能的衰……
      • SQL中的三種重復數據刪除方法 還有誰不行?
        0閱讀 0條評論 個贊
        SQL去重是數據分析工作中比較常見的一個場景,今天給大家具體介紹3種去重的方法。在使用SQL提數的時候,常會遇到表內有重復值的時候,比如我們想得到uv(獨立訪客),就需要做去重。在MySQL中……
      • 零入侵:一個注解 循環重試功能的優雅實現
        0閱讀 0條評論 個贊
        前言在實際工作中,重處理是一個非常常見的場景,比如:發送消息失敗。調用遠程服務失敗。爭搶鎖失敗。這些錯誤可能是因為網絡波動造成的,等待過后重處理就能成功。通常來說,會用try/catch,while循……
      • 談談復雜項目代碼的應用分層
        1閱讀 0條評論 個贊
        —1—背景說起應用分層,大部分人都會認為這個不是很簡單嘛就controller,service,mapper三層??雌饋砗唵?,很多人其實并沒有把他們職責劃分開,在很多代碼中,controller做……
      • Python中的協同學 是怎么回事?
        1閱讀 0條評論 個贊
        以下文章來源于公眾號-博海拾貝diary,作者so1n在io比較多的場景中,Async語法編寫的程序會以更少的時間,更少的資源來完成相同的任務,這篇文章則是介紹了Python的Async語法的協……
      • 《網絡端口大全》運維必備 就看這個吧
        1閱讀 0條評論 個贊
        老楊工作8年有余,經??吹胶芏嗑W絡工程師的簡歷里寫著熟悉“tcp/ip,http等協議”,我也每次都遵從本心的問了他們:那你可以說說你理解中的端口嗎?很多人都能答得上來一部分,但很多人都難答的比較……
      • 運維常用的34個Linux Shell腳本 對你一定有幫助!
        1閱讀 0條評論 個贊
        作為一名Linux工程師,會寫好的腳本不僅能提高工作效率,還能有更多的時間做自己的事。最近在網上沖浪的時候,也注意收集一些大佬寫過的腳本,匯總整理一下,歡迎收藏,與君共勉?。?)用戶猜數字#!/b……
      • 數據治理 區分系統、機制、流程的概念很重要
        0閱讀 0條評論 個贊
        以下文章來源于公眾號-大魚的數據人生,作者討厭的大魚先生我們剛接觸數據的時候,從事的大多是具體的數據管理活動,無論是數據的采集、開發和開放,或是元數據管理、數據質量管理或是數據安全管理等等,但當你想更……
      • 優化Docker鏡像安全性的12個技巧 建議收藏起來!
        0閱讀 0條評論 個贊
        本文介紹了12個優化Docker鏡像安全性的技巧。每個技巧都解釋了底層的攻擊載體,以及一個或多個緩解方法。這些技巧包括了避免泄露構建密鑰、以非root用戶身份運行,或如何確保使用最新的依賴……
      • 關于Tomcat技術 收藏這個就夠了!
        1閱讀 0條評論 個贊
        初識JAVA環境,3大必會內容:JRE、JDK、JVM,下面我們來說說他們的區別與特點吧。為何用JVM開發人員正常書寫的程序代碼,只能在某個平臺使用,Linux和Windows軟件包是互不通用的,如果……
      • Kubernetes網絡模型基本指南
        1閱讀 0條評論 個贊
        Kubernetes是為運行分布式集群而建立的,分布式系統的本質使得網絡成為Kubernetes的核心和必要組成部分,了解Kubernetes網絡模型可以使你能夠正確運行、監控和排查應用程序……
      • 周小川回應數字貨幣“五問”:科技公司想參與就不能耍小聰明
        1閱讀 0條評論 個贊
        他進一步稱,以大型科技公司、金融科技公司為代表的第三方機構如果也想做數字貨幣或參與支付系統,就要講究誠信,不能耍小聰明,要在不同程度上向高標準靠攏,例如很高的資本充足率、存款準備金要求、具備存款保險機制、強有力的監管及公司治理,因為一旦脫離上述標準,公司穩定性會出現問題,進而影響整個系統的穩定性?!?/div>
      • 山寨知識的“集中營”?拼多多版權糾紛裁判文書759份
        0閱讀 0條評論 個贊
        傳播知識的“中轉站”還是山寨知識的“集中營”?……
      • 茅臺五糧液產品安全質量“拉臀”?MSCI的ESG指數可信嗎?
        6閱讀 0條評論 個贊
        中國白酒企業的確沒有MSCI評價的那么差,但也的確存在提升空間。無論未來經濟利益還是可持續發展,向做得好的國外企業學習,都是有益的?!?/div>
      • 微眾銀行2021年凈利潤68.84元 同比增長39%:吸金能力遠超網商銀行
        1閱讀 0條評論 個贊
        對比來看,騰訊持股30%的微眾銀行資產總額略高于螞蟻持股30%的網商銀行,但均已超過4200億元。在營收規模和凈利潤水平上,微眾銀行營業收入較網商銀行高出94%,凈利潤高出229%,兩項業績指標均碾壓網商銀行。不過,網商銀行在營收和凈利潤的同比增速上,要高于微眾銀行?!?/div>
      • 7 種提升Spring Boot吞吐量神技!
        0閱讀 0條評論 個贊
        一、異步執行實現方式二種:1.使用異步注解@aysnc、啟動類:添加@EnableAsync注解2.JDK8本身有一個非常好用的Future類——CompletableFuture@AllArg……
      • 殼牌控股今日在港交所上市交易 收盤30.75港元
        2閱讀 0條評論 個贊
        貝殼(NYSE: BEKE)宣布,通過引入的方式,其A類普通股(“股份”)已成功在香港聯交所有限公司(“聯交所”)主板上市。這些股票在聯交所主板交易,股票代碼為“2423”,每批100股,股票簡稱為“BEKE-W”?!?/div>
      • Linux中的交互式進程查看命令htop
        1閱讀 0條評論 個贊
        htop界面展示HtopLinux進程監控工具“Htop是一個用于Linux/類Unix系統的交互式實時進程監控應用程序,也是top命的替代品,它是所有Linux操作系統上預裝的默……
      • 據說阿里達摩院裁員30% 之前三年燒了1000億
        1閱讀 0條評論 個贊
        從去年年底開始,數個互聯網大廠傳出裁員傳聞。據悉,阿里旗下達摩院,也加入了這次“畢業季”,預計將有三分之一的員工輸送到社會。2017年10月11日,阿里正式宣布成立達摩院,未來三年將投入將超過1000億人民幣,用于基礎科學和顛覆式技術創新研究?!?/div>
      • 40幅最完整的計算機網絡思維導圖
        1閱讀 0條評論 個贊
        傳輸介質簡介以太網幀結構IP編址ICMP協議ARP協議傳輸層協議路由基礎靜態路由基礎距離矢量路由協議——RIP鏈路狀態協議——OSPFHDLC&PPP原理與應用幀中繼原理與配置PPPoENAT網絡地址……
      • 白楊SEO:什么是百家號SEO?如何引流百家號?
        0閱讀 0條評論 個贊
        前言:這是公眾號白楊SEO原創第372篇。為什么再寫百家號?一是因為還有很多個人或企業沒有重視;二是現在網站SEO并不好做,不管白帽SEO還是其它。認真看完,?!?/div>
      • 中消協發布年度報告:特斯拉、星巴克、大潤發、奈雪氏茶等 被命名為
        0閱讀 0條評論 個贊
        4月22日,中國消費者協會發布《中國消費者權益保護狀況年度報告(2021)》。網絡交易中依托平臺或與平臺緊密合作的第三方鑒定機構規范性差。一些未獲得品牌授權的第三方鑒定機構在品牌真假鑒別中充當了“裁判者”角色,其鑒定資質及相關報告的合法性,成為平臺與消費者平臺與平臺間爭議分歧的焦點?!?/div>
      • 尹暢消費金融2021年收入同比下降15% 凈利潤2.24億元 去年消費者投訴601件 催收糾紛占45%
        1閱讀 0條評論 個贊
        近日,長安銀行公布2021年年度報告披露了控股子公司陜西長銀消費金融有限公司(簡稱:長銀消費金融)的經營業績。2021年,長銀消金營業收入9.8億元同比下降15%,凈利潤2.24億元同比增長10.3%,資產合計144.69億元,負債合計127.35億元?!?/div>
      • 半年來 螞蟻錢塘征信有變化?
        9閱讀 0條評論 個贊
        去年年底,中國人民銀行公告已受理錢塘征信有限公司(籌)(下稱“錢塘征信”)的個人征信業務申請的消息平地一聲驚雷。自從2020年底樸道征信獲批以后,再沒有央行受理機構申請個人征信牌照的消息傳出。更為重要的是,目前市面上僅有兩張個人征信牌照,個人征信牌照明顯供小于求,隨著助貸斷直連等政策的實施,網絡貸款業務朝著“平臺-征信機構-金融機構”的業務合作流程發展,個人征信牌照含金量不言而喻?!?/div>
      • 中超的付費服務將會遇到盡頭 服務將于5月31日停止!
        1閱讀 0條評論 個贊
        支付服務商超盟金服(深圳市超盟金服技術信息服務有限公司)發布公告,由于公司業務升級,原超盟金服產品收款服務預計將在5月31日停止,需更換為收錢吧App及收款產品即可繼續正常使用收款服務?!?/div>
      • 上海高院關于辦理涉疫金融糾紛案件適用法律的8個問答
        0閱讀 0條評論 個贊
        為更好地應對解決本輪疫情防控和經濟社會發展的新情況新問題,不斷滿足人民群眾的司法需求,上海市高級人民法院圍繞人民群眾和企業關注的熱點難點問題,修訂完成了《關于涉新冠肺炎疫情案件法律適用問題的系列問答(2022年版)》,現將《系列問答四(2022年版)》予以印發?!?/div>
      • 如何在Linux下擴展XFS根分區
        2閱讀 0條評論 個贊
        在某些情況下,/分區在Linux中磁盤空間不足。即使壓縮和刪除舊的日志文件也無濟于事,因此在這種情況下,我們別無選擇,只能擴展/文件系統。在本文中,我們將演示如何在Linux系統中擴展不……
      • 飛貸小貸高管團隊變動:三人跳槽總經理變動 因利率過高被用戶投訴至監管
        7閱讀 0條評論 個贊
        近日,飛貸APP又因“非法催收、利率超高”遭到用戶投訴。今日,深圳市地方金融監督管理局在回復用戶投訴時表示:“該局已要求深圳市飛貸小額貸款有限公司予以核實并妥善處理您的訴求,涉及合同糾紛的建議您通過司法途徑解決?!?。另外,金融虎網注意到,近日,飛貸小貸高管團隊已發生變化,總經理一職也已換人?!?/div>
      • 寧波銀行:2022年一季度歸母凈利潤57.2億元 同比增長20.8% 不良率0.77%
        1閱讀 0條評論 個贊
        寧波銀行發布一季報稱,2022年一季度,公司實現歸屬于母公司股東的凈利潤57.20億元,同比增長20.80%;實現營業收入152.63億元,同比增長15.40%。實現利息凈收入94.94億元,同比增長12.59%,在營業收入中占比為62.20%;實現非利息凈收入57.69億元,同比增長20.34%,在營業收入中占比為37.80%?!?/div>
      • 聯想系拉卡拉因涉嫌銷售假酒被曝光 旗下公司曾倒賣1億條個人信息
        7閱讀 0條評論 個贊
        據南京電視臺報道,徐先生在秦淮區經營一家煙酒店,2月初,他從拉卡拉公司進了7箱五糧春酒,共計6930元。收貨……
      • 微服務架構下基于Prometheus構建綜合監控平臺的最佳實踐
        2閱讀 0條評論 個贊
        隨著Prometheus逐漸成為云原生時代的可觀測事實標準,那么今天為大家帶來在微服務架構下基于Prometheus構建一體化監控平臺的最佳實踐和一些相關的思考,內容主要包括以下幾個部分:微服……
      最近發布資訊
      更多
      本地特级毛片,老师脱裙子让我看内裤,人妻av乱片aV出轨avApp
      <noframes id="llnpn"><pre id="llnpn"><strike id="llnpn"></strike></pre><address id="llnpn"><strike id="llnpn"><span id="llnpn"></span></strike></address>

      <pre id="llnpn"></pre>

        <address id="llnpn"><strike id="llnpn"><span id="llnpn"></span></strike></address>

        <noframes id="llnpn">

          <noframes id="llnpn"><pre id="llnpn"></pre>