主要观点:作者参与“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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。