This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Nicolas Grekas cd5c1d6361 minor #34058 [YAML] Improve performance of YAML parser (NamelessCoder)
This PR was merged into the 5.1-dev branch.

Discussion
----------

[YAML] Improve performance of YAML parser

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| Deprecations? | no
| License       | MIT

Optimise various methods and conditions to use best
performing alternatives where possible. Roughly:

* Uses methods that do not copy memory, e.g. strncmp
  as alternative for strpos matching beginning of string.
* Switches order of some conditions to put the cheapest
  checks first in order.
* Checks input before calling trim() - despite the function
  returning the same string as input, it still costs memory
  and introduces unnecessary overhead.
* Extracts variables for repeated identical function calls.
* Uses negative substring offsets instead of strlen + substr.
* Replaces single-char substr usages with substring access.

Profiling method
-----------------

Profiled using a custom script which splits and parses all provided `fixture` files from the YAML component's test directory, then profiled this through Blackfire and identified frequent method calls.

Refactoring strategy
--------------------

Most important change: switching strpos to strncmp to avoid scanning a full (and potentially very long) YAML line for occurrence of a substring.

Whenever possible, I've gone for PHP methods that do not copy memory and replaced some instances of function calls which could be replaced with substring access.

In methods which are called frequently I've gone for guard clauses to prevent further processing if a YAML line is, for example, empty. Such as avoiding trim() on already empty lines.

Profiling results
----------------

A Blackfire profiling delta can be seen on https://blackfire.io/profiles/compare/90fd3005-8b9f-4534-8bd8-1e66832bf247/graph. Taken with 200 samples which render every YAML fixture from the component's test dir.

Commits
-------

7a7c9665da [YAML] Improve performance of YAML parser
2020-02-07 15:18:18 +01:00
.github Merge branch '4.4' into 5.0 2020-02-03 14:51:17 +01:00
src/Symfony [YAML] Improve performance of YAML parser 2020-02-07 15:17:29 +01:00
.appveyor.yml Merge branch '4.4' into 5.0 2019-12-16 14:35:13 +01:00
.editorconfig Update .editorconfig 2018-09-06 16:22:56 +02:00
.gitignore Run the phpunit-bridge from a PR 2019-08-02 17:46:19 +02:00
.php_cs.dist Merge branch '4.4' 2019-11-05 18:15:52 +01:00
.travis.yml Merge branch '5.0' 2020-02-07 11:18:17 +01:00
CHANGELOG-4.0.md Merge branch '3.4' into 4.1 2018-08-01 18:22:14 +02:00
CHANGELOG-4.1.md updated CHANGELOG for 4.1.10 2019-01-06 17:16:07 +01:00
CHANGELOG-4.2.md updated CHANGELOG for 4.2.10 2019-06-26 16:19:37 +02:00
CHANGELOG-4.3.md updated CHANGELOG for 4.3.10 2020-01-21 14:13:32 +01:00
CHANGELOG-4.4.md updated CHANGELOG for 4.4.4 2020-01-31 13:44:59 +01:00
CHANGELOG-5.0.md Merge branch '5.0' 2020-02-01 11:02:10 +01:00
CODE_OF_CONDUCT.md Added the Code of Conduct file 2018-10-10 03:13:30 -07:00
composer.json Merge branch '5.0' 2020-01-04 15:20:45 +01:00
CONTRIBUTING.md Mention the community review guide 2016-12-18 22:02:35 +01:00
CONTRIBUTORS.md update CONTRIBUTORS for 3.4.37 2020-01-21 13:29:48 +01:00
LICENSE Update year in license files 2020-01-01 12:03:25 +01:00
link Merge branch '3.4' into 4.3 2019-12-06 14:11:20 +01:00
phpunit Bump phpunit-bridge cache 2020-01-31 10:55:33 +01:00
phpunit.xml.dist [Cache] Add couchbase cache adapter 2020-02-04 11:32:31 +01:00
README.md Improve Symfony description 2019-11-24 19:17:45 +01:00
UPGRADE-4.0.md Merge branch '3.4' into 4.3 2019-11-16 10:07:40 +01:00
UPGRADE-4.1.md Merge branch '4.0' into 4.1 2018-05-31 12:17:53 +02:00
UPGRADE-4.2.md Merge branch '3.4' into 4.3 2020-01-08 18:19:22 +01:00
UPGRADE-4.3.md Merge branch '4.3' into 4.4 2019-11-19 13:20:06 +01:00
UPGRADE-4.4.md add note about HTTP status code change 2019-12-23 10:53:34 -05:00
UPGRADE-5.0.md minor #35297 Improve upgrading instructions for deprecated router options (flack) 2020-01-11 08:31:01 +01:00
UPGRADE-5.1.md [Routing] add priority option to annotated routes 2020-02-05 19:01:26 +01:00
UPGRADE-6.0.md [Routing] add priority option to annotated routes 2020-02-05 19:01:26 +01:00

Symfony is a PHP framework for web and console applications and a set of reusable PHP components. Symfony is used by thousands of web applications (including BlaBlaCar.com and Spotify.com) and most of the popular PHP projects (including Drupal and Magento).

Installation

Documentation

Community

Contributing

Symfony is an Open Source, community-driven project with thousands of contributors. Join them contributing code or contributing documentation.

Security Issues

If you discover a security vulnerability within Symfony, please follow our disclosure procedure.

About Us

Symfony development is sponsored by SensioLabs, led by the Symfony Core Team and supported by Symfony contributors.