PerformanceTest.php

Namespace

Doctrine\Tests\Common\Annotations

File

drupal/core/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php
View source
<?php

namespace Doctrine\Tests\Common\Annotations;

use Doctrine\Common\Annotations\FileCacheReader;
use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\Annotations\CachedReader;
use Doctrine\Common\Annotations\DocLexer;
use Doctrine\Common\Annotations\DocParser;
use Doctrine\Common\Annotations\PhpParser;
use Doctrine\Common\Annotations\AnnotationReader;
require_once __DIR__ . '/Fixtures/Annotation/Route.php';
require_once __DIR__ . '/Fixtures/Annotation/Template.php';
require_once __DIR__ . '/Fixtures/Annotation/Secure.php';
require_once __DIR__ . '/Fixtures/SingleClassLOC1000.php';
class PerformanceTest extends \PHPUnit_Framework_TestCase {

  /**
   * @group performance
   */
  public function testCachedReadPerformanceWithInMemory() {
    $reader = new CachedReader(new AnnotationReader(), new ArrayCache());
    $method = $this
      ->getMethod();
    $time = microtime(true);
    for ($i = 0, $c = 500; $i < $c; $i++) {
      $reader
        ->getMethodAnnotations($method);
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('cached reader (in-memory)', $time, $c);
  }

  /**
   * @group performance
   */
  public function testCachedReadPerformanceWithFileCache() {
    $method = $this
      ->getMethod();

    // prime cache
    $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir());
    $reader
      ->getMethodAnnotations($method);
    $time = microtime(true);
    for ($i = 0, $c = 500; $i < $c; $i++) {
      $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir());
      $reader
        ->getMethodAnnotations($method);
      clearstatcache();
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('cached reader (file)', $time, $c);
  }

  /**
   * @group performance
   */
  public function testReadPerformance() {
    $method = $this
      ->getMethod();
    $time = microtime(true);
    for ($i = 0, $c = 150; $i < $c; $i++) {
      $reader = new AnnotationReader();
      $reader
        ->getMethodAnnotations($method);
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('reader', $time, $c);
  }

  /**
   * @group performance
   */
  public function testDocParsePerformance() {
    $imports = array(
      'ignorephpdoc' => 'Annotations\\Annotation\\IgnorePhpDoc',
      'ignoreannotation' => 'Annotations\\Annotation\\IgnoreAnnotation',
      'route' => 'Doctrine\\Tests\\Common\\Annotations\\Fixtures\\Annotation\\Route',
      'template' => 'Doctrine\\Tests\\Common\\Annotations\\Fixtures\\Annotation\\Template',
      '__NAMESPACE__' => 'Doctrine\\Tests\\Common\\Annotations\\Fixtures',
    );
    $ignored = array(
      'access',
      'author',
      'copyright',
      'deprecated',
      'example',
      'ignore',
      'internal',
      'link',
      'see',
      'since',
      'tutorial',
      'version',
      'package',
      'subpackage',
      'name',
      'global',
      'param',
      'return',
      'staticvar',
      'static',
      'var',
      'throws',
      'inheritdoc',
    );
    $method = $this
      ->getMethod();
    $methodComment = $method
      ->getDocComment();
    $classComment = $method
      ->getDeclaringClass()
      ->getDocComment();
    $time = microtime(true);
    for ($i = 0, $c = 200; $i < $c; $i++) {
      $parser = new DocParser();
      $parser
        ->setImports($imports);
      $parser
        ->setIgnoredAnnotationNames($ignored);
      $parser
        ->setIgnoreNotImportedAnnotations(true);
      $parser
        ->parse($methodComment);
      $parser
        ->parse($classComment);
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('doc-parser', $time, $c);
  }

  /**
   * @group performance
   */
  public function testDocLexerPerformance() {
    $method = $this
      ->getMethod();
    $methodComment = $method
      ->getDocComment();
    $classComment = $method
      ->getDeclaringClass()
      ->getDocComment();
    $time = microtime(true);
    for ($i = 0, $c = 500; $i < $c; $i++) {
      $lexer = new DocLexer();
      $lexer
        ->setInput($methodComment);
      $lexer
        ->setInput($classComment);
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('doc-lexer', $time, $c);
  }

  /**
   * @group performance
   */
  public function testPhpParserPerformanceWithShortCut() {
    $class = new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\NamespacedSingleClassLOC1000');
    $time = microtime(true);
    for ($i = 0, $c = 500; $i < $c; $i++) {
      $parser = new PhpParser();
      $parser
        ->parseClass($class);
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('doc-parser-with-short-cut', $time, $c);
  }

  /**
   * @group performance
   */
  public function testPhpParserPerformanceWithoutShortCut() {
    $class = new \ReflectionClass('SingleClassLOC1000');
    $time = microtime(true);
    for ($i = 0, $c = 500; $i < $c; $i++) {
      $parser = new PhpParser();
      $parser
        ->parseClass($class);
    }
    $time = microtime(true) - $time;
    $this
      ->printResults('doc-parser-without-short-cut', $time, $c);
  }
  private function getMethod() {
    return new \ReflectionMethod('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\Controller', 'helloAction');
  }
  private function printResults($test, $time, $iterations) {
    if (0 == $iterations) {
      throw new \InvalidArgumentException('$iterations cannot be zero.');
    }
    $title = $test . " results:\n";
    $iterationsText = sprintf("Iterations:         %d\n", $iterations);
    $totalTime = sprintf("Total Time:         %.3f s\n", $time);
    $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time / $iterations * 1000);
    $max = max(strlen($title), strlen($iterationTime)) - 1;
    echo "\n" . str_repeat('-', $max) . "\n";
    echo $title;
    echo str_repeat('=', $max) . "\n";
    echo $iterationsText;
    echo $totalTime;
    echo $iterationTime;
    echo str_repeat('-', $max) . "\n";
  }

}

Classes

Namesort descending Description
PerformanceTest