PHP-Parser icon indicating copy to clipboard operation
PHP-Parser copied to clipboard

gc impact on php-parser

Open staabm opened this issue 2 weeks ago • 0 comments

DISCLAIMER: I am not a GC expert, just trying to make sense of the reports I got


I am analyzing the test-suite of phpstan-src to get an idea whether I find room for performance improvements.

running PHPUnit with Xdebug gcstatistics enabled leads the following report: php -dxdebug.mode=gcstats -dxdebug.start_with_request=yes vendor/bin/phpunit :

Garbage Collection Report
version: 1
creator: xdebug 3.4.7 (PHP 8.3.28)

Collected | Efficiency% | Duration | Memory Before | Memory After | Reduction% | Function
----------+-------------+----------+---------------+--------------+------------+---------
        0 |      0.00 % |  1.11 ms |      31261120 |     31284056 |    -0.07 % | PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory::createCachedDirectorySourceLocator
        0 |      0.00 % |  1.91 ms |      58138744 |     58148144 |    -0.02 % | PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider::getSignatureMap
        0 |      0.00 % |  2.54 ms |      66966824 |     66977464 |    -0.02 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1398-1400}
        0 |      0.00 % |  4.09 ms |      87792664 |     87803568 |    -0.01 % | PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider::getSignatureMap
       14 |      0.14 % |  3.58 ms |     101602616 |    101615144 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2658-2660}
        0 |      0.00 % |  7.11 ms |     124880712 |    124901128 |    -0.02 % | PhpParser\Parser\Php8::handleBuiltinTypes
        0 |      0.00 % |  5.08 ms |     146281096 |    146300760 |    -0.01 % | PhpParser\Parser\Php8::doParse
       48 |      0.48 % |  5.37 ms |     163682728 |    163702432 |    -0.01 % | PHPStan\Type\TypeTraverser::map
        7 |      0.07 % | 11.03 ms |     186223576 |    186246440 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2847-2849}
       12 |      0.12 % | 14.13 ms |     217225432 |    217255464 |    -0.01 % | PHPStan\Analyser\Generator\ExprHandler\EqualHandler::resolveEqualSpecifiedTypes
       23 |      0.23 % | 21.72 ms |     249713040 |    249805248 |    -0.04 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1341-1343}
      126 |      1.26 % | 15.62 ms |     307721632 |    307636032 |     0.03 % | PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider::getSignatureMap
        7 |      0.07 % | 15.57 ms |     339258168 |    339274264 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2623-2625}
       60 |      0.60 % | 26.40 ms |     369757136 |    369747592 |     0.00 % | PHPStan\BetterReflection\Reflection\ReflectionMethod::createParameters
       27 |      0.27 % | 15.92 ms |     402696952 |    402732640 |    -0.01 % | PhpParser\Parser\Php8::doParse
       80 |      0.80 % | 19.40 ms |     438817400 |    438867384 |    -0.01 % | PhpParser\NodeVisitor\CommentAnnotatingVisitor::enterNode
       93 |      0.93 % | 14.10 ms |     468324896 |    468362600 |    -0.01 % | PhpParser\Node\Scalar\String_::fromString
        0 |      0.00 % | 38.08 ms |     525947344 |    525988328 |    -0.01 % | Nette\Neon\Parser::parseValue
       42 |      0.42 % | 23.13 ms |     591077968 |    591182496 |    -0.02 % | PHPUnit\Util\Reflection::filterAndSortMethods
        7 |      0.07 % | 26.91 ms |     647155592 |    647173456 |    -0.00 % | PHPStan\Type\FileTypeMapper::PHPStan\Type\{closure:/Users/m.staab/dvl/phpstan-src/src/Type/FileTypeMapper.php:542-561}
      584 |      5.84 % | 20.73 ms |     696348264 |    696362680 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
     1251 |     12.51 % | 27.26 ms |     746088520 |    745029336 |     0.14 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1563-1565}
      466 |      4.66 % | 37.13 ms |     761398824 |    761550040 |    -0.02 % | PhpParser\Parser\Php8::doParse
      321 |      3.21 % | 36.39 ms |     800271368 |    800250760 |     0.00 % | PhpParser\NameContext::getResolvedName
      601 |      6.01 % | 44.83 ms |     823784768 |    823826992 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1680-1682}
      234 |      2.34 % | 42.38 ms |     864254376 |    864193584 |     0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1581-1583}
     6817 |     68.17 % | 64.35 ms |     887450552 |    883616832 |     0.43 % | PhpParser\Lexer\Emulative::postprocessTokens
       89 |      0.89 % | 37.16 ms |     902004384 |    902210704 |    -0.02 % | PhpParser\Lexer\Emulative::postprocessTokens
      260 |      2.60 % | 36.90 ms |     919877272 |    920089704 |    -0.02 % | PhpParser\Lexer\Emulative::postprocessTokens
      521 |      5.21 % | 41.01 ms |     927763224 |    927749312 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
      832 |      8.32 % | 74.45 ms |     937045848 |    936009696 |     0.11 % | PhpParser\Lexer\Emulative::postprocessTokens
      809 |      8.09 % | 49.82 ms |     953042336 |    953004248 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
      135 |      1.35 % | 45.35 ms |     957585384 |    957612008 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
      635 |      6.35 % | 90.20 ms |     955242176 |    955171224 |     0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2623-2625}
     1542 |     15.42 % | 91.02 ms |     952283840 |    951540616 |     0.08 % | PHPStan\Type\IsSuperTypeOfResult::createNo
        5 |      0.05 % | 43.78 ms |     951981416 |    952047616 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2623-2625}
      313 |      3.13 % | 48.40 ms |     955007880 |    955001280 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
       28 |      0.28 % | 47.79 ms |     962517304 |    962653536 |    -0.01 % | PHPStan\Analyser\MutatingScope::enterFunctionLike
      468 |      4.68 % | 47.05 ms |     976685600 |    976622240 |     0.01 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 45.75 ms |     993574264 |    993575880 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % |  1.86 ms |     995479112 |    995479112 |     0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1344-1346}
        0 |      0.00 % |  2.26 ms |    1005974240 |   1005974240 |     0.00 % | PhpParser\Parser\Php8::doParse
        0 |      0.00 % |  3.49 ms |    1012022088 |   1012022088 |     0.00 % | PhpParser\NodeVisitor\CommentAnnotatingVisitor::__construct
        0 |      0.00 % | 14.71 ms |    1015074080 |   1015074080 |     0.00 % | PHPStan\Parser\RichParser::getLinesToIgnore
        0 |      0.00 % | 66.25 ms |    1015362784 |   1015363648 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2697-2700}
       26 |      0.26 % | 28.25 ms |    1035944264 |   1036031784 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1398-1400}
      713 |      7.13 % | 69.32 ms |    1040542808 |   1040682072 |    -0.01 % | PHPStan\Type\FileTypeMapper::createResolvedPhpDocBlock
       27 |      0.27 % | 64.72 ms |    1067056896 |   1067085040 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2433-2435}
      174 |      1.74 % | 65.63 ms |    1085963040 |   1085972000 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 53.37 ms |    1106343768 |   1106343880 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 59.29 ms |    1119144888 |   1119145640 |    -0.00 % | PHPStan\Type\FileTypeMapper::processNodes
      912 |      9.12 % | 60.47 ms |    1078005424 |   1077964544 |     0.00 % | array_map
     2843 |     28.43 % | 114.72 ms |    1057909784 |   1057259216 |     0.06 % | Nette\Neon\Parser::parseValue
      131 |      1.31 % | 70.46 ms |    1057036120 |   1056946752 |     0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2607-2609}
      177 |      1.77 % | 116.51 ms |    1070742656 |   1070991144 |    -0.02 % | PhpParser\NodeTraverser::traverseArray
       28 |      0.28 % | 70.58 ms |    1094100464 |   1094139120 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2623-2625}
       26 |      0.26 % | 21.68 ms |    1119461856 |   1119480944 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1386-1388}
       14 |      0.14 % | 27.52 ms |    1147372488 |   1147413280 |    -0.00 % | array_filter
       93 |      0.93 % | 61.89 ms |    1180381400 |   1180536632 |    -0.01 % | PhpParser\Lexer\Emulative::postprocessTokens
      261 |      2.61 % | 65.89 ms |    1192507528 |   1192490208 |     0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1485-1487}
       15 |      0.15 % | 37.93 ms |    1198123840 |   1198250848 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2616-2618}
      741 |      7.41 % | 76.69 ms |    1208765064 |   1208718384 |     0.00 % | PhpParser\Node\Name::concat
      655 |      6.55 % | 77.98 ms |    1204701304 |   1204736360 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
      439 |      4.39 % | 86.17 ms |    1212392984 |   1212324392 |     0.01 % | usort
       77 |      0.77 % | 89.05 ms |    1221050840 |   1221106624 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1344-1346}
      818 |      8.18 % | 92.52 ms |    1225945792 |   1225607864 |     0.03 % | PhpParser\Lexer\Emulative::postprocessTokens
     3443 |     34.43 % | 99.28 ms |    1238565272 |   1236506976 |     0.17 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1919-1923}
     1732 |     17.32 % | 53.58 ms |    1253889408 |   1252822472 |     0.09 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % |  2.88 ms |    1259373440 |   1259373440 |     0.00 % | PhpParser\Parser\Php8::doParse
        0 |      0.00 % |  4.13 ms |    1270656616 |   1270656616 |     0.00 % | PhpParser\NodeVisitor\CommentAnnotatingVisitor::__construct
        0 |      0.00 % | 20.22 ms |    1273700440 |   1273700440 |     0.00 % | PHPStan\Parser\RichParser::getLinesToIgnore
      717 |      7.17 % | 112.61 ms |    1262294552 |   1262109360 |     0.01 % | PhpParser\Node\Scalar\String_::fromString
     1069 |     10.69 % | 112.75 ms |    1270801728 |   1270033640 |     0.06 % | PhpParser\Lexer\Emulative::postprocessTokens
      354 |      3.54 % | 114.23 ms |    1269485568 |   1269483544 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
       16 |      0.16 % | 118.57 ms |    1279103072 |   1279142448 |    -0.00 % | PhpParser\Node\Name::concat
      136 |      1.36 % | 121.33 ms |    1290291824 |   1290322480 |    -0.00 % | PhpParser\NodeVisitor\NameResolver::resolveName
     1569 |     15.69 % | 59.30 ms |    1263737256 |   1263116808 |     0.05 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2623-2625}
       78 |      0.78 % | 64.06 ms |    1276008200 |   1276021136 |    -0.00 % | PHPStan\PhpDocParser\Lexer\Lexer::tokenize
      725 |      7.25 % | 119.88 ms |    1268805056 |   1268685472 |     0.01 % | PhpParser\Lexer\Emulative::postprocessTokens
      143 |      1.43 % | 63.11 ms |    1277701104 |   1277679568 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
      622 |      6.22 % | 132.67 ms |    1278343648 |   1278201136 |     0.01 % | PhpParser\Node\Name::concat
        0 |      0.00 % | 69.18 ms |    1290221784 |   1290224904 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1338-1340}
        0 |      0.00 % | 23.69 ms |    1302621544 |   1302625040 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 25.95 ms |    1319012336 |   1319014216 |    -0.00 % | PhpParser\NameContext::resolveAlias
        5 |      0.05 % | 27.67 ms |    1328688824 |   1328691408 |    -0.00 % | PhpParser\Parser\Php8::handleBuiltinTypes
        0 |      0.00 % | 32.69 ms |    1353939408 |   1353946664 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 35.95 ms |    1383011856 |   1383015240 |    -0.00 % | array_filter
        0 |      0.00 % | 39.57 ms |    1420201688 |   1420207064 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2623-2625}
       40 |      0.40 % | 45.69 ms |    1449848760 |   1449845584 |     0.00 % | PHPStan\PhpDocParser\Lexer\Lexer::tokenize
        0 |      0.00 % | 52.13 ms |    1482158240 |   1482167640 |    -0.00 % | PHPStan\PhpDocParser\Lexer\Lexer::tokenize
        0 |      0.00 % | 56.58 ms |    1515787920 |   1515801944 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1563-1565}
     2488 |     24.88 % | 122.77 ms |    1527448784 |   1526854864 |     0.04 % | PhpParser\Lexer\Emulative::postprocessTokens
       40 |      0.40 % | 178.38 ms |    1555316432 |   1555351200 |    -0.00 % | PHPStan\Analyser\SpecifiedTypes::unionWith
     7976 |     79.76 % | 211.96 ms |    1532432208 |   1530523344 |     0.12 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2607-2609}
      731 |      7.31 % | 103.29 ms |    1530463720 |   1530432440 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
       55 |      0.55 % | 106.75 ms |    1553173360 |   1553257976 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2607-2609}
      783 |      7.83 % | 108.53 ms |    1572800256 |   1572681400 |     0.01 % | PhpParser\Lexer\Emulative::postprocessTokens
       28 |      0.28 % | 111.46 ms |    1593995424 |   1594072912 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2015-2017}
        0 |      0.00 % | 55.11 ms |    1616838608 |   1616839096 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2629-2631}
        3 |      0.03 % | 65.52 ms |    1639266152 |   1639269336 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2060-2062}
       26 |      0.26 % | 65.22 ms |    1652306168 |   1652319792 |    -0.00 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2847-2849}
        0 |      0.00 % | 62.14 ms |    1672507648 |   1672507760 |    -0.00 % | PhpParser\Node\Scalar\String_::fromString
      263 |      2.63 % | 73.78 ms |    1690781840 |   1690742208 |     0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
      106 |      1.06 % | 76.23 ms |    1728320752 |   1728661200 |    -0.02 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 73.06 ms |    1748172104 |   1748172104 |     0.00 % | PHPStan\Reflection\InitializerExprTypeResolver::getType
      660 |      6.60 % | 115.86 ms |    1770331944 |   1770442320 |    -0.01 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1369-1371}
       25 |      0.25 % | 169.62 ms |    1811498160 |   1811509752 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        1 |      0.01 % | 95.62 ms |    1836402872 |   1836402768 |     0.00 % | PHPStan\Analyser\NodeScopeResolver::processExprNode
        7 |      0.07 % | 103.89 ms |    1835324648 |   1835333808 |    -0.00 % | PhpParser\Node\Scalar\String_::fromString
        0 |      0.00 % | 100.01 ms |    1852062592 |   1852062704 |    -0.00 % | PhpParser\Lexer\Emulative::postprocessTokens
        0 |      0.00 % | 103.02 ms |    1875308160 |   1878816992 |    -0.19 % | PHPStan\Reflection\InitializerExprTypeResolver::getType
      382 |      3.82 % | 106.05 ms |    1835811360 |   1835826936 |    -0.00 % | PhpParser\Node\Scalar\Int_::fromString
     6471 |     64.71 % | 257.95 ms |    1869321368 |   1867760808 |     0.08 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:2060-2062}
     1187 |     11.87 % | 254.46 ms |    1848817864 |   1848712320 |     0.01 % | PHPStan\Reflection\InitializerExprContext::fromScope
     2043 |     20.43 % | 106.31 ms |    1859396200 |   1859026144 |     0.02 % | PhpParser\Parser\Php8::PhpParser\Parser\{closure:/Users/m.staab/dvl/phpstan-src/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php:1581-1583}
      301 |      3.01 % | 247.08 ms |    1858789552 |   1858934384 |    -0.01 % | PhpParser\Lexer\Emulative::postprocessTokens
  • it seems a lot of GC is happening in PhpParser\Lexer\Emulative::postprocessTokens
  • maybe there is even more interessting insight in this report, which I don't see yet?
  • I wonder whether this report might help to sparc ideas which can help to improve performance of php-parser consuming projects

thank you

staabm avatar Dec 10 '25 11:12 staabm