php静态方法与非静态方法在性能上有什么区别?
先贴代码如下:
class class1
{
public static function test(){}
}
class class2
{
public function test(){}
} var_export(-1111111111111111111);
//代码段1
//写法1
class1::test();
var_export(-1111111111111111111);
//代码段2
//写法2
$c2 = new class2();
$c2->test();
var_export(-1111111111111111111);
//代码段3
$c2->test();
var_export(-1111111111111111111);
写法1和写法2到底有什么不同呢,其本质就是一个是静态方法,一个是非静态方法。
个人平时喜欢用写法1
原因一:只有一行,看着好看。
原因二:可能性能会好一些。
但性能的比较实在是无从下手,如果看执行时间的话,我想是永远也看不出来,因为时间肯定太小了,没法统计。
但想统计,总会有方法,可以使用gdb调试工具来统计c语言代码的行数来粗略的估计
原理:
php的var_export函数,在C代码中对应是sapi_cli_single_write。所以可以在sapi_cli_single_write函数上,设置一个断点。然后利用gdb的单步执行,来统计每个断点之间的代码行数。
步骤如下:
1,构造测试用的PHP脚本,如上方所示。
2,构造测试用的gdb脚本gdb.input,如下:
b sapi_cli_single_write
r /home/users/huangxuan01/test.php
s
s
....//以下是10000个s,代表10000个单步执行,也代表10000行C语言代码,应该够用了
解释:
b sapi_cli_single_write 就代表在var_export处设置断点
r /home/users/huangxuan01/test.php 就代表运行测试php脚本。
3,执行以下命令
gdb php < gdb.input >gdb.output
4,统计gdb.output文件,如下:
(gdb) -271 } while (ret <= && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) ret = write(STDOUT_FILENO, str, str_length);
(gdb) } while (ret <= && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) return ret; ........ (gdb) -271 } while (ret <= && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) ret = write(STDOUT_FILENO, str, str_length);
(gdb) } while (ret <= && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) return ret;
重点是-11111111111111,已经飘红。然后统计gdb.output中,-1111111111111之间的行数,就可以粗略的统计写法1和写法2的性能了,结果如下:
代码段1:754
代码段2:1174
代码段3:747
可以看出来写法2比写法1多执行了55.7%的代码,因为C语言要经过编译,所以只能说是粗略的统计代码的行数。
所以为了美观和性能的考虑,我还是坚持写法1。
至于到底有什么区别,那就得熟悉熟悉PHP的实现了。
php静态方法与非静态方法在性能上有什么区别?的更多相关文章
- 在静态方法和非静态方法上加 Synchronized的区别
Synchronzied 修饰非静态方法==>对象锁 Synchronzied 修饰静态方法==>其实是类锁,因为是静态方法,它把整个类锁起来了: 1.Synchronized修饰非静态方 ...
- Java中synchronized用在静态方法和非静态方法上面的区别
synchronized 修饰在 static方法和非static方法的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以sync ...
- Java中堆、栈,静态方法和非静态方法的速度问题
一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储 ...
- 转 C#中静态方法与非静态方法区别比较
C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向你做一下解析. C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用 ...
- C#静态类 静态方法与非静态方法比较
静态类 在类(class)上加入static修饰,表示该类无法被实例化,并将该类中,无法实例化变量或函数 静态类的主要特性 仅包含静态成员 无法实例化 静态类的本质,时一个抽象的密封类,所以不能被继承 ...
- [转]C#静态方法与非静态方法的比较
http://wenku.baidu.com/view/4e1704084a7302768e9939e0.html C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他 ...
- java中静态方法和非静态方法调用的一点小困扰,已解决。
public static void main(String[] args) { // TODO Auto-generated method stub SimpleGui1B gui=new Simp ...
- c#静态方法和非静态方法区别
c#静态方法和非静态方法区别 C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用上会有什么不同呢?让我们来看看最直观的差别:使用了static 修饰符的方法为 ...
- C#中静态方法和非静态方法的区别
静态方法和非静态方法的区别: 1.静态方法不需要类实例化就可以调用,反之非静态方法需要实例化后才能调用: 2.静态方法只能访问静态成员和方法,非静态方法都可以访问: 3.静态方法不能标记为overri ...
- 使用synchronized修饰静态方法和非静态方法有什么区别
前言 最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录.供大家学习参考. Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法 ...
随机推荐
- php 获取图片、swf的尺寸大小
PHP获取图片大小函数. getimagesize() 能够得到图片及flash(swf)的大小. 语法 1 list($width, $height, $type, $attr) = getima ...
- JavaScript注入漏洞的原理及防范
初次接触: 初次接触JavaScript注入漏洞后,如果不对这种漏洞的作用机理仔细分析并提取出其发生的某种模式,你就不能做到快速的发现项目中可能存在的所有注入风险并在代码中防范. 发生模式: Java ...
- iis下设置默认页
IIS设置设默认页 计算机-->右键管理-->服务器和应用程序-->Internet信息服务 -->网站-->你发布的网站名-->功能视图-->IIS大类里- ...
- asp 下拉框二级联动
<script language = "JavaScript"> //js开始 var aaa;//定义aaa变量 aaa=0;//aaa赋0 bb = new Arr ...
- com.google.common.eventbus.EventBus介绍
以下内容直接翻译了EventBus的注释: com.google.common.eventbus.EventBus介绍: 首先这个类是线程安全的, 分发事件到监听器,并提供相应的方式让监听器注册它们自 ...
- sql 日期时间格式转换
Sql日期时间格式转换 sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, ...
- css滑动门制作圆角按钮
之前做项目的时候,基本都是将圆角背景图切成三块,故而每次用的标签都超级多,a标签中总是包含三个span,然后里面还得放按钮,导航冗余标签极多. 事实上是之前理解的滑动门的精髓不够到位. 现在有两种方式 ...
- 使用Arcglobe 10与3dmax建立三维城市
转自:http://www.cnblogs.com/jinlun/p/3380307.html 随着国家大力推进数字城市的建设,三维城市的建设也是势在必行的.与传统二维地图相比,三维城市在立体层次.视 ...
- 一步一步学Remoting系列文章
转自:http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一:从简单开始(原创)一步一 ...
- [Irving] Android 点击两次返回退出系统
Activity 中定义成员变量: private Long firstClickTime = 0l; //记录第一次点击时间 重载OnKeyDown方法 代码: @Override public b ...