ホームページ >バックエンド開発 >PHPチュートリアル >PHP 関数 count と strlen の効率分析
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)著作権表示: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。