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目前运用的很正常.

译者 | 布加迪审校 | 孙淑娟目前,没有用于构建和管理机器学习(ML)应用程序的标准实践。机器学习项目组织得不好,缺乏可重复性,而且从长远来看容易彻底失败。因此,我们需要一套流程来帮助自己在整个机器学习生命周期中保持质量、可持续性、稳健性和成本管理。图1. 机器学习开发生命周期流程使用质量保证方法开发机器学习应用程序的跨行业标准流程(CRISP-ML(Q))是CRISP-DM的升级版,以确保机器学习产品的质量。CRISP-ML(Q)有六个单独的阶段:1. 业务和数据理解2. 数据准备3. 模型

thinkphp是国产框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。

什么是 celery这次我们来介绍一下 Python 的一个第三方模块 celery,那么 celery 是什么呢? celery 是一个灵活且可靠的,处理大量消息的分布式系统,可以在多个节点之间处理某个任务; celery 是一个专注于实时处理的任务队列,支持任务调度; celery 是开源的,有很多的使用者; celery 完全基于 Python 语言编写;所以 celery 本质上就是一个任务调度框架,类似于 Apache 的 airflow,当然 airflow 也是基于 Python

AI就像一个黑匣子,能自己做出决定,但是人们并不清楚其中缘由。建立一个AI模型,输入数据,然后再输出结果,但有一个问题就是我们不能解释AI为何会得出这样的结论。需要了解AI如何得出某个结论背后的原因,而不是仅仅接受一个在没有上下文或解释的情况下输出的结果。可解释性旨在帮助人们理解:如何学习的?学到了什么?针对一个特定输入为什么会做出如此决策?决策是否可靠?在本文中,我将介绍6个用于可解释性的Python框架。SHAPSHapleyAdditiveexplanation(SHapleyAdditi

AOP(面向切面编程)是一种编程思想,用于解耦业务逻辑和横切关注点(如日志、权限等)。在PHP中,使用AOP框架可以简化编码,提高代码可维护性和可扩展性。本文将介绍在PHP中使用AOP框架的基本原理和实现方法。一、AOP的概念和原理面向切面编程,指的是将程序的业务逻辑和横切关注点分离开来,通过AOP框架来实现统一管理。横切关注点指的是在程序中需要重复出现并且

已安装Microsoft.NET版本4.5.2、4.6或4.6.1的MicrosoftWindows用户如果希望Microsoft将来通过产品更新支持该框架,则必须安装较新版本的Microsoft框架。据微软称,这三个框架都将在2022年4月26日停止支持。支持日期结束后,产品将不会收到“安全修复或技术支持”。大多数家庭设备通过Windows更新保持最新。这些设备已经安装了较新版本的框架,例如.NETFramework4.8。未自动更新的设备可能

如果你在Windows11上安装了2022年5月累积更新,你可能已经注意到你一直使用的许多应用程序都不像以前那样工作了。强制性安全更新KB5013943正在使某些使用.NET框架的应用程序崩溃。在某些情况下,用户会收到错误代码:0xc0000135。可选更新中报告了类似的问题,但并不普遍。随着2022年5月的更新,该错误似乎已进入生产渠道,这次有更多用户受到影响。崩溃在使用.NETFramework的应用程序中很常见,Discord或MicrosoftTeams等

近几年人工智能领域的突破大多由自监督学习推动,比如BERT中提出的MLM(MaskedLanguageModel),通过将文本中的部分单词遮盖后重新预测,使得海量无标记文本数据也能用来训练模型,自此开启了大规模预训练模型的新时代。但自监督学习算法也有明显的局限性,通常只适用于单一模态(如图像、文本、语音等)的数据,并且需要大量的算力从海量数据中进行学习。相比之下,人类的学习效率要显著高于当前的AI模型,并且可以从不同类型的数据中进行学习。2022年1月,MetaAI发布了自监督学习框架data2


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

Dreamweaver Mac版
시각적 웹 개발 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
