http://www.securityandcaffeine.com/2008/04/03/php-mysql-and-mysql_fetch_array/
上面的文章让我很惊讶。它说:
mysql_fetch_array()
- “1 – 使用引号!有 1/7 的时间与“$result['2']
进行比较$result[2]
”
知道这是否属实吗?
http://www.securityandcaffeine.com/2008/04/03/php-mysql-and-mysql_fetch_array/
上面的文章让我很惊讶。它说:
mysql_fetch_array()
- “1 – 使用引号!有 1/7 的时间与“$result['2']
进行比较$result[2]
”
知道这是否属实吗?
这似乎完全是基于一种误解。看到这句话,突出我的:
1 – 如果您引用这些值,但不要使用引号,您会浪费速度。根据 Reinhold Weber 的博客:#17:“<code>$row['id'] 比
$row[id]
“. 如果你经常这样做,而且经常……哎哟。
是的,$row['id']
比 快$row[id]
,因为$row[id]
是语法错误,它试图解析一个常量,然后将它变成一个字符串,同时抛出一个通知。但是$row[1]
和$row['id']
都是有效的并且应该执行非常相同。如果查找数字索引和查找字符串索引之间存在差异,那么它必须非常小,以至于不值得您花时间。
PHP 数组实际上并没有位置键,但都是关联的,这一发现并不是真正的新闻,因此也没有广泛传播的速度问题。事实上,这个快速基准测试表明“数字字符串”索引很容易成为所有索引中最慢的查找:http ://codepad.org/aeNJ2u3O
无论如何,您应该使用mysql_fetch_assoc
or mysql_fetch_row
,它分别为您获取命名(字符串索引)或未命名(数字索引)数组。使用_fetch_array
,这让你们俩都受益,通常是不必要的。
如果您想要真实的性能数据,请针对您的用例对其进行基准测试。
基于此报价:
获得 $result['2'] 的时间是 $result[2] 的 1/7。
我非常怀疑这是没有任何理由的准确,特别是考虑到文章链接到另一个人的(不存在的)博客作为参考。
为什么?因为在内部,PHP对数组使用哈希表。Kendall Hopkins 的回答很好地解释了实现:
PHP 数组是一个链式哈希表(在键冲突时查找 O(c) 和 O(n)),它允许使用 int 和 string 键。它使用 2 种不同的散列算法将这两种类型放入相同的散列键空间。此外,存储在散列中的每个值都链接到存储在它之前的值和存储在它之后的值(链表)。它还有一个临时指针,用于保存当前项目,以便可以迭代哈希。
因此,除非有基准证明 int 和 string 键的两种独立散列算法存在 7 倍的性能差距,否则这篇文章是无稽之谈。
哦,男孩... PHP 真的是一种灾难性的语言。
当您将 MySQL 结果作为组合关联/普通数组提取时,您真正得到的是关联数组,其中一些键是数字索引。
因此,任何查找都是关键查找。
$result[2]
和之间的区别$result["2"]
在于 PHP 需要首先将整数2
转换为字符串"2"
,以便它可以将其用作查找的键。
转换是否需要 6 倍的查找长度,我不能说;我没有做过任何基准测试。然而,它更长的事实当然是合理的。不管是真是假?文章的原作者有责任支持这些说法。