mysql_fetch_array()引号会增加速度吗?

11 浏览
0 Comments

mysql_fetch_array()引号会增加速度吗?

这篇文章让我感到惊讶。它说:

mysql_fetch_array() - "1 – 使用引号!与$result[2]相比,获取$result['2']的时间是其1/7"

你有没有想法这是否属实?

0
0 Comments

这个问题的出现原因是基于一个误解。根据引用的内容,我们可以看到:

“$row['id']比$row[id]快7倍。”

是的,$row['id']比$row[id]快,因为$row[id]是一个语法错误,它试图解析一个常量,然后将其转化为一个字符串,并同时抛出一个通知。但是$row[1]和$row['id']都是有效的,并且它们的性能应该非常相似。如果查找数字索引和查找字符串索引之间有差异,那么差异应该是非常小到不值得你花时间去关注的。

PHP数组并没有真正的位置键,而是全部都是关联的,这并不是一个新闻,而且由于这个原因并没有广泛的速度问题。实际上,这个快速基准测试显示,“数字字符串”索引是所有索引中最慢的查找:http://codepad.org/aeNJ2u3O

无论如何,你应该使用mysql_fetch_assoc或mysql_fetch_row,前者返回一个有命名索引(字符串索引)的数组,后者返回一个没有命名索引(数字索引)的数组。使用_fetch_array,它返回两者,通常是不必要的。

如果你想要真正的性能数据,请为你的使用情况进行基准测试。

只是为了完整起见,在引用的内容下面大约5行有这样一句话:“使用引号!使用$result['2']的时间是使用$result[2]的1/7。简单的速度修复。”

是的,但如果这是基于上面的引用,那就是胡说八道。

0
0 Comments

根据以下引用:

相比于$result[2],获取$result['2']的时间只有1/7。

非常怀疑这个说法是否准确,因为文章链接到了另一个人的(不存在的)博客作为参考。为什么?因为在内部,PHP使用哈希表来实现数组。Kendall Hopkins的回答很好地解释了实现方法:

PHP数组是一个链接哈希表(查找复杂度为O(c)和O(n)在键碰撞时),允许int和string键。它使用两种不同的哈希算法将两种类型适应到相同的哈希键空间中。此外,存储在哈希中的每个值都链接到它之前和之后存储的值(链表)。它还有一个临时指针,用于保存当前项,以便可以迭代哈希。

因此,除非有一个基准测试证明整数和字符串键的两个单独的哈希算法之间存在7倍的性能差距,否则这篇文章是无意义的。

解决方法:

目前没有证据表明使用$result['2']比$result[2]更高效。因此,这个问题的解决方法是不相信这个未经证实的说法,并要求提供具体的基准测试来支持这个论断。

0
0 Comments

mysql_fetch_array() 函数用于从结果集中获取一行作为关联数组、数字数组或二者兼而有之。然而,在PHP中,当将MySQL结果作为组合的关联数组/普通数组进行提取时,实际上获取的是一个关联数组,其中一些键是数值索引。因此,任何查找都是键查找。

在这里,$result[2] 和 $result["2"] 的区别在于,PHP需要将整数2转换为字符串"2",以便将其用作查找的键。转换的长度是否比查找的长度长6倍,我无法确定,因为我没有进行任何基准测试。然而,它确实更长的事实是可以被接受的。这是否属实,需要由原文章的作者提供支持这些说法。

我敢说,如果它确实更快(我怀疑它不会快那么多),那么它只会在非常小的数组中产生可察觉的差异。我们这里谈论的是微秒级的时间,只有在至少有成千上万次迭代时才会有意义,而如果你有那么多数据,你就有比微秒级差异更大的问题了。

以下的基准测试似乎与你所说的相反:http://codepad.org/Xy4BqiTw

你的测试没有进行整数到字符串的转换。

尽管如此,经过阅读你的回答后,我倾向于同意你的分析。我仍然坚持认为PHP是一种灾难性的语言。

这个基准测试测试了$array[123],你认为这会导致一个转换,还有$array['123']和$array['abc'],所以包括了所有可能的情况。

0