Disons simplement la conclusion : le vide est le plus efficace.
count doit d'abord compter la longueur du tableau, puis porter un jugement.
Certaines réponses ont souligné que c'était incorrect
J'ai toujours pensé que la complexité temporelle du comptage était O(n). Après avoir été giflé cette fois, j'ai lu le code original et j'ai découvert qu'il s'agissait en fait de O(1).
compter le lien du code source
La fonction
count fonctionne sur les tableaux :
case IS_ARRAY:
RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC) )
Passons en revue l'opération php_count_recursive, puis regardons le fonctionnement de la fonction php_count_recursive sur le tableau : cnt = zend_hash_num_elements(Z_ARRVAL_P(array));
code zend_hash_num_elements :
ZEND_API int zend_hash_num_elements(HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
isset ne peut détecter que si une variable est définie ou a une valeur NULL. Si la variable est définie en premier, !$array équivaut à vide. L'efficacité est également égale.
isset Je ne répondrai pas si je ne peux pas le dire. Il s'agit d'une connaissance de base de PHP Lisez le manuel Ce qui suit parle principalement de empty et de compte Différence isset不能判断我就不回答了,这是PHP基础知识,看手册去 下面主要讲empty和count的区别
根据PHP的源代码(PHP5.4)
typedef struct _HashTable
{
int size;
int elem_num;
Bucket** buckets;
} HashTable;
Empty empty() 0.118691
Empty count() 0.218974
Full empty() 0.133747
Full count() 0.216424
IF empty empty() 0.166474
IF empty count() 0.235922
IF full empty() 0.120642
IF full count() 0.248273
OR empty empty() 0.123875
OR empty count() 0.258665
OR full empty() 0.157839
OR full count() 0.224869
IF/ELSE empty empty() 0.167004
IF/ELSE empty count() 0.263351
IF/ELSE full empty() 0.145794
IF/ELSE full count() 0.248425
( ? : ) empty empty() 0.169487
( ? : ) empty count() 0.265701
( ? : ) full empty() 0.149847
( ? : ) full count() 0.252891
Dans l'implémentation, qu'elle soit vide ou count, la HashTable pointée par zVal - value est prise . elem_num dans la structure.
Dans d'autres réponses, il est dit que count doit calculer la longueur S'il vous plaît, PHP peut être si stupide ? Si vous exécutez bêtement à nouveau la liste chaînée, count renverra directement le elem_num
du tableau.
Conclusion
🎜Il n'y a donc aucune différence entre les deux méthodes de jugement🎜, empty consiste à exécuter elem_num <= 0, puisque les deux exécutent le même code sous-jacent, mais ce n'est pas le cas. signifie que la vitesse d'exécution est la même. 🎜
🎜Différence de vitesse🎜
🎜Selon les résultats des tests sur http://stackoverflow.com/ques... (les résultats des tests sont ci-dessous), vous constaterez que count est en effet plus lent que empty Un point, vous vous demandez peut-être, puisque tout est jugé elem_num, pourquoi est-ce lent ? 🎜
🎜Pourquoi est-ce lent🎜
🎜Selon le manuel PHP : 🎜
🎜Il y a une ligne pour expliquer le vide : 🎜
🎜Parce qu'il s'agit d'un constructeur de langage plutôt que d'une fonction, il ne peut pas être appelé par des fonctions variables. 🎜
🎜Le résultat est donc évident : count est une fonction, mais empty est un constructeur de langage Puisqu'il s'agit d'un langage constructeur , l'efficacité d'exécution est nettement supérieure à celle des fonctions. Par exemple, echo est aussi un constructeur de langage, 🎜
🎜Par exemple, echo 'str1','str2'; est plus efficace que echo 'str1'.'str2';, sans parler de print code > 🎜
🎜🎜Mais🎜, après avoir utilisé OpCache ou JIT, il n'y a aucune différence entre les deux (voir ci-dessous), car les deux ont été optimisés. 🎜
🎜PHP natif🎜
Empty empty() 0.210652
Empty count() 0.212123
Full empty() 0.206016
Full count() 0.204722
IF empty empty() 0.227852
IF empty count() 0.219821
IF full empty() 0.220823
IF full count() 0.221397
OR empty empty() 0.218813
OR empty count() 0.220105
OR full empty() 0.229118
OR full count() 0.221787
IF/ELSE empty empty() 0.221499
IF/ELSE empty count() 0.221274
IF/ELSE full empty() 0.221879
IF/ELSE full count() 0.228737
( ? : ) empty empty() 0.224143
( ? : ) empty count() 0.222459
( ? : ) full empty() 0.221606
( ? : ) full count() 0.231288
isset ne peut pas déterminer si le tableau est vide
Les deux autres : http://stackoverflow.com/ques...
La conclusion est que vider est plus efficace que compter
Disons simplement la conclusion : le vide est le plus efficace.
count doit d'abord compter la longueur du tableau, puis porter un jugement.compter le lien du code source
La fonctioncount fonctionne sur les tableaux :
Passons en revue l'opération php_count_recursive, puis regardons le fonctionnement de la fonction php_count_recursive sur le tableau :
cnt = zend_hash_num_elements(Z_ARRVAL_P(array));
code zend_hash_num_elements :
isset ne peut détecter que si une variable est définie ou a une valeur NULL.
Si la variable est définie en premier, !$array équivaut à vide. L'efficacité est également égale.
isset
Je ne répondrai pas si je ne peux pas le dire. Il s'agit d'une connaissance de base de PHP Lisez le manuelCe qui suit parle principalement de
empty
et deisset
不能判断我就不回答了,这是PHP基础知识,看手册去下面主要讲
empty
和count
的区别根据PHP的源代码(PHP5.4)
在实现中,不论是
empty
,还是count
,都是取的zVal - value
指向的HashTable
结构中的elem_num
结论
所以两者之间的判断方式是没任何差距的,
empty
就是执行了elem_num <= 0
,既然两者都是执行相同底层代码,但是不代表执行速度一样。速度差异
根据http://stackoverflow.com/ques...中的测试结果来看(测试结果在下方),大家会发现
count
的确要比empty
慢一点,也许大家会疑惑,既然都是判断的elem_num
,那么为什么会慢?为什么慢
所以结果很明显了:
count
是函数,empty
却是一个语言构造器
既然是
语言构造器
,那执行效率是肯定比函数高的,比如echo
也是语言构造器
,比如
Basé sur le code source PHP (PHP5.4)echo 'str1','str2';
的效率就比echo 'str1'.'str2';
高,更不用说print
vide
oucount
, laHashTable
pointée parzVal - value
est prise .elem_num
dans la structure. du tableau. Conclusionempty
consiste à exécuterelem_num <= 0
, puisque les deux exécutent le même code sous-jacent, mais ce n'est pas le cas. signifie que la vitesse d'exécution est la même. 🎜 🎜Différence de vitesse🎜 🎜Selon les résultats des tests sur http://stackoverflow.com/ques... (les résultats des tests sont ci-dessous), vous constaterez quecount
est en effet plus lent queempty
Un point, vous vous demandez peut-être, puisque tout est jugéelem_num
, pourquoi est-ce lent ? 🎜 🎜Pourquoi est-ce lent🎜count
est une fonction, maisempty
est unconstructeur de langage
Puisqu'il s'agit d'un
langage constructeur
, l'efficacité d'exécution est nettement supérieure à celle des fonctions. Par exemple,echo
est aussi unconstructeur de langage
, 🎜 🎜Par exemple,echo 'str1','str2';
est plus efficace queecho 'str1'.'str2';
, sans parler deprint code > 🎜 🎜🎜Mais🎜, après avoir utilisé OpCache ou JIT, il n'y a aucune différence entre les deux (voir ci-dessous), car les deux ont été optimisés. 🎜 🎜PHP natif🎜
🎜Utilisation de JIT (ou HipHop VM)🎜 rrreeeTout d'abord, s'il ne s'agit pas d'un tableau associatif, isset est plus efficace et vide est généralement utilisé