CI框架源码阅读笔记5 基准测试 BenchMark.php,cibenchmark.php
CI框架源码阅读笔记5 基准测试 BenchMark.php,cibenchmark.php
上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的。这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架。
从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识、把握这个框架。
按照惯例,在开始之前,我们贴上CI中不完全的核心组件图:
由于BenchMark是CI中第一个加载的core组件,因此我们的分析首先从该组件开始。BenchMark的含义非常明确,使用过BenchMark工具的同学应该比较清楚,这是一个基准组件。既然是BenchMark,我们便可大胆猜想,BM组件的主要功能就是记录程序的运行时间、内存使用、cpu使用等情况。
先看类图:
这个组件结构较简单,只有一个marker内部变量和三个对外的接口:
<span>1</span> <span>Elapsed_time </span><span>2</span> <span>Mark </span><span>3</span> Memory_usage
下面一个个展开来看:
1. mark
函数的签名为:
<span>function</span> mark(<span>$name</span>)
这个函数接受一个string类型的参数,而实现更简单,只有一句话:
<span>$this</span>->marker[<span>$name</span>] = <span>microtime</span>();
也就是说这个函数只是用于记录函数调用时刻的时间点。
值得注意的是,由于Controller中的特殊处理(之后我们会详细解释),你的应用程序控制器中可以使用$this->benchmark->mark($name);的方式来添加运行的时间点,例如:
$this->benchmark->mark("function_test_start"); $this->_test(); $this->benchmark->mark("function_test_end"); print_r($this->benchmark);
其中,function_test_start和function_test_end分别用于记录函数调用开始和结束的时间点
打印出的结果:
现在要计算函数的调用时间,需要用到BenchMark组件的第二个函数elapsed_time
2. elapsed_time
函数的签名为:
<span>function</span> elapsed_time(<span>$point1</span> = '', <span>$point2</span> = '', <span>$decimals</span> = 4)
3个参数均为可选参数
(1). 如果$point1 为空,则返回’{elapsed_time}’
if ($point1 == '') { return '{elapsed_time}'; }
纳尼!明明应该返回的是时间,怎么反而返回的是字符串,而且这么奇怪(类似smarty的标签)。其实,在Output组件中,{elapsed_time}会被替换,我们暂时看一下替换的方式:
$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); $output = str_replace('{elapsed_time}', $elapsed, $output);
也就是说,没有指定参数的情况下,调用该函数实际得到的是total_execution_time_start这个时间点到total_execution_time_end这个时间点的时间差。更进一步,由于total_execution_time_start是在BM加载之后设置的第一个mark点(total_execution_time_end并未定义,返回的是当前时间点),该函数返回的实际就是系统的加载和运行时间。
(2).如果调用的是未知的mark点。则结果是未知的,直接返回空:
if ( ! isset($this->marker[$point1])) { return ''; }
(3).如果没有设置$point2的mark点,则将$point2的mark点设置为当前的时间点。
if ( ! isset($this->marker[$point2])) { $this->marker[$point2] = microtime(); }
(4).最后返回的两个mark点的时间差:
list($sm, $ss) = explode(' ', $this->marker[$point1]); list($em, $es) = explode(' ', $this->marker[$point2]); return number_format(($em + $es) - ($sm + $ss), $decimals);
还看之前的例子,这里我们可以通过调用:
<span>echo</span> <span>$this</span>->benchmark->elapsed_time("function_test_start","function_test_end");
得到函数的执行时间.
3. memory_usage
这个函数返回的是系统的内存使用情况(MB单位),与{elapsed_time} 一样,这个函数返回的{memory_usage}也会在Output中被替换:
<span>$memory</span> = ( ! <span>function_exists</span>('memory_get_usage')) ? '0' : <span>round</span>(memory_get_usage()/1024/1024, 2).'MB'<span>; </span><span>$output</span> = <span>str_replace</span>('{memory_usage}', <span>$memory</span>, <span>$output</span>);
由于BenchMark组件本身较简单,我们不做更多的解释。
最后,贴上这个组件的源码:
<?<span>php </span><span>class</span><span> CI_Benchmark { </span><span>/*</span><span>* * List of all benchmark markers and when they were added * * @var array </span><span>*/</span> <span>var</span> <span>$marker</span> = <span>array</span><span>(); </span><span>/*</span><span>* * Set a benchmark marker * * @access public * @param string $name name of the marker * @return void </span><span>*/</span> <span>function</span> mark(<span>$name</span><span>) { </span><span>$this</span>->marker[<span>$name</span>] = <span>microtime</span><span>(); } </span><span>/*</span><span>* * Calculates the time difference between two marked points. * If the first parameter is empty this function instead returns the {elapsed_time} pseudo-variable. This permits the full system * @access public * @param string a particular marked point * @param string a particular marked point * @param integer the number of decimal places * @return mixed </span><span>*/</span> <span>function</span> elapsed_time(<span>$point1</span> = '', <span>$point2</span> = '', <span>$decimals</span> = 4<span>) { </span><span>if</span> (<span>$point1</span> == ''<span>) { </span><span>return</span> '{elapsed_time}'<span>; } </span><span>if</span> ( ! <span>isset</span>(<span>$this</span>->marker[<span>$point1</span><span>])) { </span><span>return</span> ''<span>; } </span><span>if</span> ( ! <span>isset</span>(<span>$this</span>->marker[<span>$point2</span><span>])) { </span><span>$this</span>->marker[<span>$point2</span>] = <span>microtime</span><span>(); } </span><span>list</span>(<span>$sm</span>, <span>$ss</span>) = <span>explode</span>(' ', <span>$this</span>->marker[<span>$point1</span><span>]); </span><span>list</span>(<span>$em</span>, <span>$es</span>) = <span>explode</span>(' ', <span>$this</span>->marker[<span>$point2</span><span>]); </span><span>return</span> <span>number_format</span>((<span>$em</span> + <span>$es</span>) - (<span>$sm</span> + <span>$ss</span>), <span>$decimals</span><span>); } </span><span>/*</span><span>* * Memory Usage * This function returns the {memory_usage} pseudo-variable. </span><span>*/</span> <span>function</span><span> memory_usage() { </span><span>return</span> '{memory_usage}'<span>; } }</span>
phpunit
不是最新的mysql.ci目前运用的很正常.

熱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)

評估Java框架商業支援的性價比涉及以下步驟:確定所需的保障等級和服務等級協定(SLA)保證。研究支持團隊的經驗和專業知識。考慮附加服務,如昇級、故障排除和效能最佳化。權衡商業支援成本與風險緩解和提高效率。

PHP框架的學習曲線取決於語言熟練度、框架複雜性、文件品質和社群支援。與Python框架相比,PHP框架的學習曲線較高,而與Ruby框架相比,則較低。與Java框架相比,PHP框架的學習曲線中等,但入門時間較短。

輕量級PHP框架透過小體積和低資源消耗提升應用程式效能。其特點包括:體積小,啟動快,記憶體佔用低提升響應速度和吞吐量,降低資源消耗實戰案例:SlimFramework創建RESTAPI,僅500KB,高響應性、高吞吐量

編寫清晰全面的文件對於Golang框架至關重要。最佳實踐包括:遵循既定文件風格,例如Google的Go程式設計風格指南。使用清晰的組織結構,包括標題、子標題和列表,並提供導覽。提供全面且準確的信息,包括入門指南、API參考和概念。使用程式碼範例說明概念和使用方法。保持文件更新,追蹤變更並記錄新功能。提供支援和社群資源,例如GitHub問題和論壇。建立實際案例,如API文件。

根據應用場景選擇最佳Go框架:考慮應用類型、語言特性、效能需求、生態系統。常見Go框架:Gin(Web應用)、Echo(Web服務)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。實戰案例:建構RESTAPI(Fiber),與資料庫互動(gorm)。選擇框架:效能關鍵選fasthttp,靈活Web應用選Gin/Echo,資料庫互動選gorm。

針對不同領域的Java框架學習路線圖:Web開發:SpringBoot和PlayFramework。持久層:Hibernate和JPA。服務端響應式程式設計:ReactorCore和SpringWebFlux。即時計算:ApacheStorm和ApacheSpark。雲端運算:AWSSDKforJava和GoogleCloudJava。

日前,Google正式向符合資格的Pixel智慧型手機和平板電腦用戶推送了Android15Beta4更新,這標誌著Android15作業系統已邁入平台穩定階段,預示著其穩定版將在接下來的幾天內正式與全球用戶見面。同時,這項進展也為三星電子的Galaxy設備系列加速其OneUI7.0版本的開發過程注入了新的活力。 1.[Android15Beta4推廣三星OneUI7.0穩定建置](https://www.cnbeta.com/articles/tech/1427022.htm)隨著Android15Bet

Go框架學習的迷思有以下5種:過度依賴框架,限制彈性。不遵循框架約定,程式碼難以維護。使用過時庫,帶來安全和相容性問題。過度使用包,混淆程式碼結構。忽視錯誤處理,導致意外行為和崩潰。
