在 PHP 中处理十亿行!

主要观点:作者参与“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 版本编译参数对性能的影响。
阅读 34
0 条评论