ホームページ >バックエンド開発 >PHPチュートリアル >PHP 関数 count と strlen の効率分析

PHP 関数 count と strlen の効率分析

WBOY
WBOYオリジナル
2016-06-23 13:27:401178ブラウズ

PHP の統計的な配列長関数である count() と、その効率が O(1) なのか O(n) なのか、について悩んでいます。最近PHPのソースコードを眺めてまとめてみました。分析は次のとおりです:
zend によって PHP に与えられたすべての変数はユニオンの形式で保存され、文字列の保存と配列の保存はハッシュ テーブルの形式で保存されます。 PHPの変数unionは次のように記述されます

/*     * zval     */ typedef struct _zval_struct zval; typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount; zend_uchar type; /* active type */ zend_uchar is_ref; }; 

ハッシュテーブルの構造は次のようになります:

typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement;     Bucket *pInternalPointer; /* Used for element traversal */ Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection; #if ZEND_DEBUG int inconsistent; #endif } HashTable; 

一般変数(string)がstrlenを使って長さを取得すると、実際に得られるのはzvalue_value.str構造体です。 len 属性、効率は O(1) 倍です。特に注意すべき点は、strlen には php のコア実装がありませんが、zend のマクロ定義を使用してそれを取得します。

操作には実際には 2 つの結果があります。2 番目のパラメーター モードも count API で言及されており、このモード パラメーターは再カウントが必要かどうかを指定し、再カウントは配列を 1 回走査し、効率は

O(N) になります。 [N: length]。このとき、再カウントは行われません。このときの効率も O(1) 倍です。以下:

#define Z_STRLEN(zval) (zval).value.str.len ... #define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) ... #define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) 
著作権表示: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。