博采众长,精于一技。Live for love, work for dream.

十二生肖查询 For Android

十二生肖,是由十一种源于自然界的动物即鼠、牛、虎、兔、蛇、马、羊、猴、鸡、狗、猪以及传说中的龙所组成,用于记年,顺序排列为子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪。 在多个国家和民族被广泛使用。目前支持功能:输入年份,可以查询到属相,属相特征及配对。
十二生肖查询 For Android.png

继续阅读 »

Typecho出错自动跳转回首页

最近本Blog作了一次分类调整。尽管也知道对于SEO来说很不利,但是为了知识管理,只能忍一时之痛了。调整完后,从Google,Baidu过来的链接全部404了。还好Typecho有自己的404出错处理,但是仍然不够啊,用户在404页面停留了,所以我给它动了动小手术。当出错时,1秒后自动跳转回首页。
编辑 /var/Typecho/Common.php 大概253行的位置

/** 设置http code */
if (is_numeric($code) && $code > 200) {
    require_once 'Typecho/Response.php';
    Typecho_Response::setStatus($code);
    Typecho_Response::setHeader('refresh', '1;url=http://blog.rebill.info/');//1秒后跳转
}

永久链接也从原来的{category}/{slug}.html改成了archives/{slug}.html,担心自己没准哪天又调整分类就再度杯具了。

MongoDB注意事项

1.mmap failed with out of memory
在32位平台MongoDB不允许数据库文件(累计总和)超过2G,而64位平台没有这个限制。64位需取消虚拟内存限制。
取消虚拟内存限制的方法:修改etc/profile文件,在文件最后加入一行
ulimit -v unlimited
保存,在命令行执行
# source /etc/profile
(重启linux也可以生效)

PHP函数的实现原理及性能分析(三)

常用php函数实现及介绍

count
count是我们经常用到的一个函数,其功能是返回一个数组的长度。
count这个函数,其复杂度是多少呢? 一种常见的说法是count函数会遍历整个数组然后求出元素个数,因此复杂度是O(n)。那实际情况是不是这样呢?我们回到count的实现来看一下,通过源码可以发现,对于数组的count操作,函数最终的路径是zif_count-> php_count_recursive-> zend_hash_num_elements,而zend_hash_num_elements的行为是 return ht->nNumOfElements,可见,这是一个O(1)而不是O(n)的操作。实际上,数组在php底层就是一个hash_table,对于hash表,zend中专门有一个元素nNumOfElements记录了当前元素的个数,因此对于一般的count实际上直接就返回了这个值。由此,我们得出结论: count是O(1)的复杂度,和具体数组的大小无关。
非数组类型的变量,count的行为时怎样?对于未设置变量返回0,而像int、double、string等则会返回1

strlen
Strlen用于返回一个字符串的长度。那么,他的实现原理是如何的呢?我们都知道在c中strlen是一个o(n)的函数,会顺序遍历字符串直到遇到\0,然后出长度。Php中是否也这样呢?答案是否定的,php里字符串是用一个复合结构来描述,包括指向具体数据的指针和字符串长度(和c++中string类似),因此 strlen就直接返回字符串长度了,是常数级别的操作。另外,对于非字符串类型的变量调用strlen,它会首先将变量强制转换为字符串再求长度,这点需要注意。

isset和array_key_exists
这两个函数最常见的用法都是判断一个 key是否在数组中存在。但是前者还可以用于判断一个变量是否被设置过。如前文所述,isset并非真正的函数,因此它的效率会比后者高很多。推荐用它代替array_key_exists。
array_push和array[]
两者都是往数组尾部追加一个元素。不同的是前者可以一次push多个。他们最大的区别在于一个是函数一个是语言结构,因此后者效率要更高。因此如果只是普通的追加元素,建议使用array []。

继续阅读 »

PHP函数的实现原理及性能分析(二)

类方法
类方法其执行原理和用户函数是相同的,也是翻译成opcodes顺次调用。类的实现,zend用一个数据结构zend_class_entry来实现,里面保存了类相关的一些基本信息。这个entry是在php编译的时候就已经处理完成。
在 zend_function的common中,有一个成员叫做scope,其指向的就是当前方法对应类的zend_class_entry。关于php中面向对象的实现,这里就不在做更详细的介绍,今后将专门写一篇文章来详述php中面向对象的实现原理。就函数这一块来说,method实现原理和 function完全相同,理论上其性能也差不多,后面我们将做详细的性能对比。

性能对比
函数名长度对性能的影响

》》测试方法 对名字长度为1、2、4、8、16的函数进行比较,测试比较它们每秒可执行次数,确定函数名长度对性能的影 响

》》测试结果如下图
02.jpg

》》结果分析
从图上可以看出,函数名的长度对性能还是会有一定的影响。一个长度为1的函数和长度为16的 空函数调用 ,其性能差了1倍。分析一下源码不难找到原因,如前面叙述所说,函数调用的时候zend会先在一个全局的funtion_table中通过函数名查询相关信息,function_table是一个哈希表。必然的,名字越长查询所需要的时间就越多。 因此,在实际编写程序的时候,对多次调用的函数,名字建议不要太长。

虽然函数名长度对性能有一定影响,但具体有多大呢?这个问题应该还是需要结合实际情况来考虑,如果一个函数本身比较复杂的话,那么对整体的性能影响并不大。一个建议是对于那些会调用很多次,本身功能又比较简单的函数,可以适当取一些言简意赅的名字。
函数个数对性能的影响

继续阅读 »

返回顶部