主要观点:作者参与“The One Billion Row Challenge”,用 PHP 编写代码解决,不断优化以提高性能。
关键信息:
- 初始用
fgetcsv()
读文件,代码运行 25 分钟,CPU 占用 100%,fgetcsv()
占 46%CPU 时间。 - 优化用
fgets()
替代fgetcsv()
,运行时间降至 19 分 49 秒,下降 21%。 - 使用引用、减少比较、添加类型转换等进一步优化,分别再降低 10%、2%、21%的时间。
- 开启 OPCache 的 JIT 后,运行时间缩短至 7 分 19 秒,减少 45.9%。
- 省略
fgets()
的len
参数,减少内存分配,提升约 1%性能。 - 使用多线程并行处理数据,运行时间缩短至 1 分 35 秒,再结合重新编译 PHP 至
CFLAGS="-Os..."
,最终达到 27.7 秒。 - 后续还有优化空间,如移除
isset()
、不检查fgets()
返回值、用stream_get_line()
替代fgets()
等,最终达到 12.76 秒。
重要细节: - 代码中各种函数的使用及优化过程,如
fgets()
、fgetcsv()
、strpos()
、substr()
、stream_get_line()
等。 - 多线程处理数据的代码实现,包括分割文件成块、创建和管理线程等。
- 不同优化措施对运行时间和 CPU 占用的影响数据及图表展示。
- 关于硬件(MacOS 苹果硅硬件、Hetzner 的 AX161)及 PHP 版本编译参数对性能的影响。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。