PHP 生成 uuid 的幾種方法以及性能比較

UUID 已經使用了很多年並且存在多種生成方法。

我更喜歡 PECL 擴展而不是 ramsey/uuid 包,因爲它更的簡單明瞭。數週前,我們有了將 PECL 擴展移植到純 PHP 的想法,與 Nicolas Grekas 一起,我們將其發佈爲 Symfony Polyfill。然後,我們想寫博客介紹 FFI 這一 PHP 7.4 的新功能。因此,與 Baptiste Leduc 一起,我們將 libuuid 庫與 PHP 進行了綁定。

因此,現在至少有四種方法可以用 PHP 生成 UUID,讓我們進行對比:

  • PECL 擴展;
  • PECL 擴展的 PHP 實現包 polyfill ;
  • 一個建立在多個版本生成器和 UUID 組件之上的抽象層 ramsey/uuid;
  • 用於 PHP 7.4 以上版本的 FFI 綁定;

我創建了一組 基準測試可以對這些實現進行比較。

 

UUID V1 版本 (基於時間)#

+----------------------+---------+-------+
| 主題            | 平均時間    | 插值 |
+----------------------+---------+-------+
| benchPecl            | 0.637μs | 1.00x |
| benchSymfonyPolyfill | 1.736μs | 2.72x |
| benchJoliCodeFFI     | 1.349μs | 2.12x |
| benchRamsey          | 4.295μs | 6.74x |
+----------------------+---------+-------+

UUID V4 版本 (隨機數)#

+----------------------+---------+-------+
| 主題            | 平均時間    | 插值 |
+----------------------+---------+-------+
| benchPecl            | 4.546μs | 2.87x |
| benchSymfonyPolyfill | 1.583μs | 1.00x |
| benchJoliCodeFFI     | 5.416μs | 3.42x |
| benchRamsey          | 2.103μs | 1.33x |
+----------------------+---------+-------+

這些版本有什麼不同?

 

V1

V1 是基於時間的。它沒有太多隨機數據,但是每個 UUID 必須是唯一的,因此需要一個內部計數器。

  • PECL 是這裏最快的,因爲它使用內核的一些特性來獲得增量數據。
  • FFI 綁定比較慢,因爲在底層庫中,FFI 對於速度非常快的東西會有很大的開銷。這種開銷來自於 PHP 和底層庫之間的轉換類型。
  • Polyfill 的速度較慢,因爲它必須手動處理計數器。
  • Rasmey 實現最慢,因爲它處理計數器的方式可以改進。

 

V4

V4 充滿了隨機數據。這意味着 CPU 生成一個 V4 比生成一個 V1 更加昂貴。

  • 由於 PHP 的原因 Polyfill 是最快的。PHP 使用了 sys_getrandom() ,一種更快的方式來獲取隨機數據。
  • 由於相同的原因,Rasmey 實現也非常快。
  • PECL 的運行速度要慢得多,因爲底層庫 (libuuid) 每次從 PHP 的代碼中調用 uuid_create() 時都會在 /dev/urandom 上打開一個新的文件描述符。
  • FFI 綁定是最慢的,因爲它依賴於相同的 libuuid 庫,並且增加了 FFI 開銷。

 

結論

現在您已經瞭解了有關 uuid 的所有知識,因此… 只需做出 正確的選擇

 

請記住,FFI 綁定僅適用於 PHP 7.4+,因此(目前)在很多項目中可能無法使用。

ramsey /uuid 是一個利用許多 UUID 生成器的 UUID 組件(它可以在內部使用 PECL )。在 ramsey /uuid 實現中使用 polyfill 可能會很有意思。

由於 polyfill 與 PECL 擴展是一樣的,所以最後的選擇是關於 API 的:

  • 簡單的:PECL(如果您無法安裝擴展程序,則使用 polyfill )。
  • 更加豐富的功能:ramsey /uuid 組件。
  • 成熟的:FFI 綁定。

現在,您瞭解了所有使用 PHP 生成 UUID 的方法,只需要使用合適的方法即可。

 

八重櫻:怎麼從一名碼農成爲架構師的必看知識點:目錄大全(不定期更新)​zhuanlan.zhihu.com圖標

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提升,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨需要的可以免費分享給大家,需要的可以加入我的官方羣點擊此處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章