追踪php代码性能瓶颈
写了一段很简单的代码示例,却发现运行起来速度很慢,出现性能问题的代码量并不大,排除了IO问题以后,写了一段测试代码,果然问题很快重现。 ?php$y="1800";$x = array();for($j=0;$j[root@xp trace]# time php test.phpreal 0m4.116suser 0m4.070ssys 0m0.
写了一段很简单的代码示例,却发现运行起来速度很慢,出现性能问题的代码量并不大,排除了IO问题以后,写了一段测试代码,果然问题很快重现。
<?php $y="1800"; $x = array(); for($j=0;$j [root@xp trace]# time php test.php real 0m4.116s user 0m4.070s sys 0m0.028s
可以看出时间耗掉了4秒,下面用strace跟踪没拿到什么有效信息。
[root@xp trace]# strace -ttt -o log.txt php test.php [root@xp trace]# more log.txt
只看到这两次系统调用之间的延时非常大,却并不知道干了什么?一筹莫展了,幸好,Linux下的调试利器除了strace还有ltrace(当然还有dtrace,ptrace)。
引用:strace用来 跟踪一个进程的系统调用或信号产生的情况,而 ltrace用来 跟踪进程调用库函数的情况(via?IBM developerworks)。
[root@xp trace]# ltrace -c php test.php
我们看到库函数strtol的调用非常之频繁,太夸张了,然后我又查了一下这个库函数,简单的说就是把字符串转换成长整形,可以猜测PHP引擎已经检测到这是一个字符串型的数字,所以期望将他们转换成长整型来比较,这个转换过程中消耗了太多时间,我们再次执行:
[root@xp trace]# ltrace -e "strtol" php test.php (0, 0, 0xec4b00, -1, 0x1f25bc2) = 0x32dd221160 strtol(0x1c9f9d0, 0, 10, 0, 0x7fffe64537f0) = 8 strtol(0x1c9f9b0, 0, 10, 0x7fffe6453880, 0x7fffe64537f0) = 30719 strtol(0x1c9f9d0, 0, 10, 0x32ddb8ee88, 0x32ddb8d580) = -9 strtol(0x1c9f070, 0, 10, 371, 0x10119a0) = 0 strtol(0x1c9ea90, 0, 10, 370, 0x10119a0) = 0 strtol(0x1c9e580, 0, 10, 81, 0x1010c60) = 1 strtol(0x1c9fae0, 0, 10, 82, 0x1010c60) = 0 strtol(0x1ca0cf0, 0, 10, 26, 0x1010c60) = 0 strtol(0x1c9f7a0, 0, 10, 408, 0x1010c60) = 0 strtol(0x1c9e6d0, 0, 10, 432, 0x1010c60) = 0 strtol(0xcea563, 0, 10, 433, 0x1010c60) = 0 strtol(0xcea563, 0, 0, 440, 0x1010c60) = 0 strtol(0x1c9f8f0, 0, 0, 72, 0x1010c60) = -1 strtol(0xcea563, 0, 10, 298, 0x1010c60) = 0 strtol(0x1c9ee50, 0, 10, 5, 0x1010c60) = 1 strtol(0x1c9fb80, 0, 10, 83, 0x1010c60) = 1 strtol(0x1c9fc30, 0, 0, 88, 0x1010c60) = 1024 strtol(0x1c9fce0, 0, 10, 96, 0x1010c60) = 0 strtol(0x1c9fd90, 0, 10, 97, 0x1010c60) = 0 strtol(0x1c9f330, 0, 10, 98, 0x1010c60) = 1 strtol(0x1c9e4d0, 0, 10, 461, 0x1010c60) = 0 strtol(0x1ca05a0, 0, 10, 0, 0x1010c60) = 0 strtol(0x1ca0650, 0, 10, 1, 0x1010c60) = 0 strtol(0x1ca0700, 0, 10, 2, 0x1010c60) = 0 strtol(0x1c9ec70, 0, 0, 8, 0x1010c60) = 0 strtol(0x1ca03c0, 0, 10, 411, 0x1010c60) = 1 strtol(0x1ca0260, 0, 10, 409, 0x1010c60) = 0 strtol(0x1ca0310, 0, 10, 410, 0x1010c60) = 0 strtol(0x1ca0460, 0, 10, 412, 0x1010c60) = 1 strtol(0x1c9f130, 0, 10, 3, 0x1010c60) = 0 strtol(0x1c9f1d0, 0, 10, 24, 0x1010c60) = 0 strtol(0x1c9e9f0, 0, 10, 369, 0x10119a0) = 1 strtol(0x1c9feb0, 0, 10, 25, 0x1010c60) = 0 strtol(0x1c9f3d0, 0, 10, 80, 0x1010c60) = 0 strtol(0x1c9ebd0, 0, 10, 413, 0x1010c60) = 1 strtol(0x1c9efe0, 0, 0, 48, 0x1010c60) = 17 strtol(0x1c9f850, 0, 10, 0, 0) = 0 strtol(0x1ca0d90, 0, 10, 457, 0x1010c60) = 1 strtol(0x1ca0e40, 0, 0, 160, 0x1010c60) = 1000 strtol(0x1ca0500, 0, 0, 432, 0x1010ec0) = 1000 strtol(0xd214c5, 0, 0, 520, 0x1010c60) = 64 strtol(0xd37961, 0, 0, 584, 0x1010c60) = 1000 strtol(0x1ca1250, 0, 10, 560, 0x1010c60) = 1 strtol(0x1c9f990, 0, 0, 0, 0) = 512 strtol(0x1c9eb30, 0, 10, 0, 0) = 14 strtol(0x1ca0f80, 0, 10, 459, 0x1010c60) = 1 strtol(0x1ca1030, 0, 10, 512, 0x1010c60) = 0 strtol(0xcea563, 0, 10, 460, 0x1010c60) = 0 strtol(0xd37a32, 0, 0, 24, 0x100ec20) = 16 strtol(0xd37a49, 0, 0, 32, 0x100ec20) = 120 strtol(0xd37a7c, 0, 0, 544, 0x1010c60) = 300 strtol(0xcea563, 0, 10, 513, 0x1010c60) = 0 strtol(0x1c9ef30, 0, 10, 0, 0) = 30711 strtol(0x1c9f700, 0, 10, 0, 0x1011d80) = 1 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 531783 (0, 0, 0, 15, 0x42622d0) = 0x32dd221160 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 531720 (0, 0, 0, 11, 0x7f9fa7b51b80) = 0x32dd221160 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 531719 (0, 0, 0, 6, 0x9275f60) = 0x32dd221160 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 531897 (0, 0, 0, 9, 0x7f9fa74b8338) = 0x32dd221160 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 531901 (0, 0, 0, 3, 0x7f9fa72a8340) = 0x32dd221160 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 532944 (0, 0, 0, 3, 0x7f9fa70641d0) = 0x32dd221160 (0x32dd221160, 0, 0, 0x32dd221160, 0) = 525536 (0, 0, 0, 3, 0x7f9fa6e5c680) = 0x32dd221160 .....
知道了症结所在,我们解决的办法就很多了,最简单的就是为in_array加第三个参数为true,即变为严格比较,同时还要比较类型,这样避免了PHP自作聪明的转换类型,跑起来果然快多了。
[root@xp trace]# time php test.php real 0m0.988s user 0m0.959s sys 0m0.024s



熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。
