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修饰非静态方法,实际上是对调用该方法 ...
随机推荐
- hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)
http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...
- 标准初始化css样式表
body { font-size:12px; line-height:1.3; font-family:'微软雅黑', Tahoma,Helvetica,Arial,'宋体', sans-serif; ...
- Hanoi
递归解决 汉诺塔 class Han{ int num; int steps; Han(int num){ this.num=num; } void total() { System.out.prin ...
- 使用ssh公钥实现免密码登录
使用ssh公钥实现免密码登录 ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(10.207.160.34),B(10 ...
- gentoo
http://www.aboutyun.com/thread-8522-1-1.html .java.io.IOException: Connection reset by peer c ...
- C#变成数据导入Excel和导出Excel
excel 基础 •整个excel 表格叫工作表:workbook:工作表包含的叫页:sheet:行:row:单元格:cell. •excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就 ...
- asp.net将sql语句封装在类库中
将sql语句封装在cs中,通过类库的引用使用他的select.update.insert 源代码(cs): using System; using System.Collections.Generic ...
- vc:如何从Internet上有效而稳定地下载文件
http://www.vckbase.com/index.php/wv/172 如何从Internet上有效而稳定地下载文件 ,这是很多网络应用程序要考虑的重要问题,本文提供的代码段针对这个问题进行了 ...
- XBMC 最新版本错误
1. Syntax error: "(" unexpected 修改 tools/depends下的makefile.include 将NDK_VER=0x9d
- Word对象模型 (.Net Perspective)
本文主要针对在Visual Studio中使用C# 开发关于Word的应用程序 来源:Understandingthe Word Object Model from a .NET Developer' ...