我刚刚改进了 Stanislav 链接的基准以使其生效:
https://3v4l.org/rDpVv
Results for PHP 7.4.1:
Runs by case: 500000
Memory usage at start: 426,320
Run Duration % Memory
Dynamic 0.0594 30% 496
Dynamic instantiated 0.0917 46% 0 #
Dynamic instantiated stored 0.1994 100% 48,967,472 # slowest
Storage only 0.0422 21% 16,781,392
Cost of instations only when stored 0.1572 79% 32,186,O8O # cost of stored instatiations minus storage cost (diff of 2 previous lines)
Static 0.0870 44% 0 # equivalent to dynamic with instantiation
Singletons with many getInstance 0.1213 61% 376
Singletons with one getInstance 0.0669 34% 320 # equivalent to "Dynamic"
Functions assigning $GLOBALS 0.0605 30% 0 # more than 2 times longer than using "global"
Functions assigning a global 0.0458 23% 32 # fastest. 32bits allocated? probably passed by copy... odd
Functions with $counter by ref 0.0707 35% 0 # slow for functions
Functions with $counter static prop 0.0524 26% 0
评论:
- “修改全局的函数”最快,占 23%
- “实例化,存储然后调用动态方法”是最长的,所以 100%
- 存储实例会消耗大量内存和总时间的 21%
- “通过 ref 将 $counter 作为参数传递”几乎是“修改全局函数”的 2 倍
- 调用修改静态属性的函数非常快,几乎是调用静态方法的一半。有趣的
- MyClass::call() 花费了 Singleton::getInstance()->call() 时间的 75%,但花费了 $mySingleton->call() 的 133%
- MyClass::call() 的成本与 (new MyClass)->call() 一样多
- “静态”在成本上等同于“动态非存储”。十分有趣!
开发实践结论(2020 年 1 月生效):
- 永远不要使用 $GLOBALS,'global $myVar' 超级快(并且分配 32 位?)
- 仅使用全局变量和函数进行编程是最快的 PHP 吗?老派摇滚!
- 为大量方法调用存储一个实例然后删除它是最佳的。
- 避免存储大量实例。
- “实例化调用”和“静态调用”具有相同的成本
干杯
PS:由于限制,即使结果不是 100% 稳定,我也无法进行更多的运行(我看到整个工作台的某些刷新有 20% 的变化) PS 2:如果您只想禁用 3v4l.org 的缓存在代码中任意位置添加空格