为什么在PHP中使用sizeof在for循环中缓存长度更快

为什么在PHP中使用sizeof在for循环中缓存长度更快,php,performance,comparison,Php,Performance,Comparison,在本文中,用户计算了sizeof与count的性能 结果表明,使用sizeof缓存数组长度比使用count更快(尽管可读性较差) 这对我来说毫无意义,因为sizeof只是一个要计数的别名,至少在我看来,它至少会产生一个额外的机器调用(因为它解析为count…) 我是否遗漏了一些关键的东西,或者它实际上速度较慢,但计算是错误的 此行为是否依赖于操作码缓存 以下是线索: 我是否遗漏了一些关键的东西,或者它实际上速度较慢,但计算是错误的 你没有遗漏任何东西,结果根本不可靠 此行为是否依赖于操作码缓存

在本文中,用户计算了
sizeof
count
的性能

结果表明,使用
sizeof
缓存数组长度比使用
count
更快(尽管可读性较差)

这对我来说毫无意义,因为sizeof只是一个要计数的别名,至少在我看来,它至少会产生一个额外的机器调用(因为它解析为count…)

我是否遗漏了一些关键的东西,或者它实际上速度较慢,但计算是错误的

此行为是否依赖于操作码缓存

以下是线索:

我是否遗漏了一些关键的东西,或者它实际上速度较慢,但计算是错误的

你没有遗漏任何东西,结果根本不可靠

此行为是否依赖于操作码缓存

事实并非如此

在执行方面

#define ZEND_FE(name, arg_info)                     ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)
#define ZEND_FALIAS(name, alias, arg_info)          ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0)
这就是“正常”和别名函数的声明方式。如你所见,这是完全相同的

这意味着,结果不应与Zend发动机外部区分

我是否遗漏了一些关键的东西,或者它实际上速度较慢,但计算是错误的

你没有遗漏任何东西,结果根本不可靠

此行为是否依赖于操作码缓存

事实并非如此

在执行方面

#define ZEND_FE(name, arg_info)                     ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)
#define ZEND_FALIAS(name, alias, arg_info)          ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0)
这就是“正常”和别名函数的声明方式。如你所见,这是完全相同的


这意味着,结果不应与Zend引擎外部区分。

编写微基准点很难。真的很难

要从微基准中获得可靠、可重复、具有统计意义、统计上可靠的结果,需要对统计数据有更深入的了解,需要对所有可能的实现及其可能的优化(理想情况下,甚至是尚未存在的实现和未来的优化)有更深入的了解,对所涉及代码的高级理解,以及编写微基准的丰富经验。编写基准测试的人通常是专门的专业人员,他们整天都在编写基准测试,每天都在编写,持续数年。即便如此,他们还是弄错了。IIRC中有一个著名的SPEC基准测试案例(相当于专门从事基准测试的组织),它本应测试数据库驱动程序的性能,但实际上最终测试了内存分配器的性能

即使你写了一个可靠的,可重复的,有统计意义的,有统计意义的微基准,你最终也会得到完全可靠的,完全可重复的,有统计意义的,有统计意义的结果,这些结果也是完全无用的,因为根据定义,微基准并不能反映实际的用例、负载和环境


所有这些都表明:不可能存在任何性能差异。一个基准可以声明其他情况的唯一方法是基准被破坏。别名按字面意思实现为同一代码的两个名称;使用哪个名称并不重要。

编写微基准点很难。真的很难

要从微基准中获得可靠、可重复、具有统计意义、统计上可靠的结果,需要对统计数据有更深入的了解,需要对所有可能的实现及其可能的优化(理想情况下,甚至是尚未存在的实现和未来的优化)有更深入的了解,对所涉及代码的高级理解,以及编写微基准的丰富经验。编写基准测试的人通常是专门的专业人员,他们整天都在编写基准测试,每天都在编写,持续数年。即便如此,他们还是弄错了。IIRC中有一个著名的SPEC基准测试案例(相当于专门从事基准测试的组织),它本应测试数据库驱动程序的性能,但实际上最终测试了内存分配器的性能

即使你写了一个可靠的,可重复的,有统计意义的,有统计意义的微基准,你最终也会得到完全可靠的,完全可重复的,有统计意义的,有统计意义的结果,这些结果也是完全无用的,因为根据定义,微基准并不能反映实际的用例、负载和环境


所有这些都表明:不可能存在任何性能差异。一个基准可以声明其他情况的唯一方法是基准被破坏。别名按字面意思实现为同一代码的两个名称;你用哪个名字并不重要。

它只是展示了微基准有多脆弱,写一个可靠的微基准有多复杂。我认为同样的问题是要看的问题。它只是展示了微基准有多脆弱,写一个可靠的微基准有多复杂。我认为同样的问题是要看的问题看,写微基准是很难的。真的很难。要从微基准中获得可靠、可重复、具有统计意义的结果,需要对统计数据有更深入的了解,需要对所有可能的实现及其可能的优化(理想情况下甚至是尚未存在的实现和未来的优化)有更深入的了解,对所涉及代码的高级理解,以及编写微基准的丰富经验。编写基准测试的人通常是专门的专业人士,他们整天、每天……多年来什么也不做,只编写基准测试。即便如此,他们还是弄错了。IIRC中有一个著名的SPEC基准测试案例(相当于专门从事基准测试的组织),它本应测试数据库驱动程序的性能,但实际上最终测试了内存分配器的性能。即使你是男人