Skip to content

Commit 3998c6d

Browse files
committed
Actualize and improve benchmarks
1 parent e2b71d6 commit 3998c6d

19 files changed

+489
-231
lines changed

bench/composer.json

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,24 @@
2525
"symfony/var-dumper": "^5.4|^6.0|^7.1"
2626
},
2727
"scripts": {
28+
"bench:base": "phpbench run --report=default --tag=current",
29+
"bench:instantiate": [
30+
"@bench:base --filter=benchInstantiate"
31+
],
32+
"bench:extract": [
33+
"@bench:base --filter=benchExtract"
34+
],
35+
"bench:normalize": [
36+
"@bench:base --filter=benchNormalization"
37+
],
38+
"bench:denormalize": [
39+
"@bench:base --filter=benchDenormalization"
40+
],
2841
"bench": [
29-
"phpbench run --report=default --tag=current --filter=benchInstantiate",
30-
"phpbench run --report=default --tag=current --filter=benchExtract",
31-
"phpbench run --report=default --tag=current --filter=benchNormalization",
32-
"phpbench run --report=default --tag=current --filter=benchCachedNormalization",
33-
"phpbench run --report=default --tag=current --filter=benchDenormalization",
34-
"phpbench run --report=default --tag=current --filter=benchCachedDenormalization"
42+
"@bench:instantiate",
43+
"@bench:extract",
44+
"@bench:normalize",
45+
"@bench:denormalize"
3546
]
3647
},
3748
"minimum-stability": "dev",

bench/phpbench.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
"opcache.enable": 1,
99
"opcache.enable_cli": 1,
1010
"opcache.jit_buffer_size": "128M",
11-
"opcache.jit": "1255",
1211
"xdebug.mode": "off"
1312
},
1413
"storage.xml_storage_path": "var",

bench/src/Instantiator/CloneInstantiatorBench.php

Lines changed: 0 additions & 31 deletions
This file was deleted.

bench/src/Serializers/JMSAttributesBench.php

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,59 +6,37 @@
66

77
use JMS\Serializer\Serializer;
88
use JMS\Serializer\SerializerBuilder;
9-
use Metadata\Cache\PsrCacheAdapter;
109
use PhpBench\Attributes\BeforeMethods;
1110
use PhpBench\Attributes\Iterations;
1211
use PhpBench\Attributes\Revs;
1312
use PhpBench\Attributes\Warmup;
1413
use TypeLang\Mapper\Bench\Stub\ExampleRequestDTO;
1514

16-
#[Revs(30), Warmup(3), Iterations(5), BeforeMethods('prepare')]
15+
#[Revs(100), Warmup(3), Iterations(5), BeforeMethods('prepare')]
1716
final class JMSAttributesBench extends MapperBenchmark
1817
{
19-
private readonly Serializer $raw;
20-
private readonly Serializer $cached;
18+
private readonly Serializer $serializer;
2119

2220
public function prepare(): void
2321
{
2422
parent::prepare();
2523

26-
$this->raw = (new SerializerBuilder())
24+
$this->serializer = (new SerializerBuilder())
2725
->enableEnumSupport()
2826
->addDefaultListeners()
2927
->addDefaultHandlers()
3028
->addDefaultDeserializationVisitors()
3129
->addDefaultSerializationVisitors()
3230
->build();
33-
34-
$this->cached = (new SerializerBuilder())
35-
->enableEnumSupport()
36-
->addDefaultListeners()
37-
->addDefaultHandlers()
38-
->addDefaultDeserializationVisitors()
39-
->addDefaultSerializationVisitors()
40-
->setCacheDir(__DIR__ . '/../../var')
41-
->setMetadataCache(new PsrCacheAdapter('jms', $this->psr6))
42-
->build();
4331
}
4432

4533
public function benchNormalization(): void
4634
{
47-
$this->raw->toArray($this->denormalized, type: ExampleRequestDTO::class);
48-
}
49-
50-
public function benchCachedNormalization(): void
51-
{
52-
$this->cached->toArray($this->denormalized, type: ExampleRequestDTO::class);
35+
$this->serializer->toArray($this->denormalized, type: ExampleRequestDTO::class);
5336
}
5437

5538
public function benchDenormalization(): void
5639
{
57-
$this->raw->fromArray(self::NORMALIZED, ExampleRequestDTO::class);
58-
}
59-
60-
public function benchCachedDenormalization(): void
61-
{
62-
$this->cached->fromArray(self::NORMALIZED, ExampleRequestDTO::class);
40+
$this->serializer->fromArray(self::NORMALIZED, ExampleRequestDTO::class);
6341
}
6442
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Bench\Serializers;
6+
7+
use JMS\Serializer\Serializer;
8+
use JMS\Serializer\SerializerBuilder;
9+
use Metadata\Cache\PsrCacheAdapter;
10+
use PhpBench\Attributes\BeforeMethods;
11+
use PhpBench\Attributes\Iterations;
12+
use PhpBench\Attributes\Revs;
13+
use PhpBench\Attributes\Warmup;
14+
use TypeLang\Mapper\Bench\Stub\ExampleRequestDTO;
15+
16+
#[Revs(100), Warmup(3), Iterations(5), BeforeMethods('prepare')]
17+
final class JMSAttributesWithSymfonyPsr6Bench extends MapperBenchmark
18+
{
19+
private readonly Serializer $serializer;
20+
21+
public function prepare(): void
22+
{
23+
parent::prepare();
24+
25+
$this->serializer = (new SerializerBuilder())
26+
->enableEnumSupport()
27+
->addDefaultListeners()
28+
->addDefaultHandlers()
29+
->addDefaultDeserializationVisitors()
30+
->addDefaultSerializationVisitors()
31+
->setCacheDir(self::CACHE_DIR . '/jms')
32+
->setMetadataCache(new PsrCacheAdapter('jms', $this->createPsr6Cache('jms')))
33+
->build();
34+
}
35+
36+
public function benchNormalization(): void
37+
{
38+
$this->serializer->toArray($this->denormalized, type: ExampleRequestDTO::class);
39+
}
40+
41+
public function benchDenormalization(): void
42+
{
43+
$this->serializer->fromArray(self::NORMALIZED, ExampleRequestDTO::class);
44+
}
45+
}

bench/src/Serializers/MapperBenchmark.php

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,12 @@ abstract class MapperBenchmark
3434
],
3535
];
3636

37-
protected readonly ExampleRequestDTO $denormalized;
38-
39-
protected readonly CacheItemPoolInterface $psr6;
37+
protected const CACHE_DIR = __DIR__ . '/../../var';
4038

41-
protected readonly CacheInterface $psr16;
39+
protected readonly ExampleRequestDTO $denormalized;
4240

4341
protected function prepare(): void
4442
{
45-
$this->psr6 = new FilesystemAdapter(
46-
namespace: 'benchmarks',
47-
directory: __DIR__ . '/../../var',
48-
);
49-
50-
$this->psr16 = new Psr16Cache(
51-
pool: $this->psr6,
52-
);
53-
5443
$this->denormalized = new ExampleRequestDTO(
5544
name: 'Example1',
5645
items: [
@@ -74,8 +63,21 @@ protected function prepare(): void
7463
);
7564
}
7665

66+
protected function createPsr6Cache(string $namespace): CacheItemPoolInterface
67+
{
68+
return new FilesystemAdapter(
69+
namespace: $namespace,
70+
directory: self::CACHE_DIR,
71+
);
72+
}
73+
74+
protected function createPsr16Cache(string $namespace): CacheInterface
75+
{
76+
return new Psr16Cache(
77+
pool: $this->createPsr6Cache($namespace),
78+
);
79+
}
80+
7781
abstract public function benchNormalization(): void;
78-
abstract public function benchCachedNormalization(): void;
7982
abstract public function benchDenormalization(): void;
80-
abstract public function benchCachedDenormalization(): void;
8183
}

bench/src/Serializers/SymfonyDocBlockBench.php

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,60 +9,33 @@
99
use PhpBench\Attributes\Revs;
1010
use PhpBench\Attributes\Warmup;
1111
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
12-
use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory;
13-
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
14-
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
1512
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
1613
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
1714
use Symfony\Component\Serializer\Serializer;
1815
use TypeLang\Mapper\Bench\Stub\ExampleRequestDTO;
1916

20-
#[Revs(30), Warmup(3), Iterations(5), BeforeMethods('prepare')]
17+
#[Revs(100), Warmup(3), Iterations(5), BeforeMethods('prepare')]
2118
final class SymfonyDocBlockBench extends MapperBenchmark
2219
{
23-
private readonly Serializer $raw;
24-
private readonly Serializer $cached;
20+
private readonly Serializer $serializer;
2521

2622
public function prepare(): void
2723
{
2824
parent::prepare();
2925

30-
$this->cached = (new Serializer([
31-
new ArrayDenormalizer(),
32-
new ObjectNormalizer(
33-
classMetadataFactory: new CacheClassMetadataFactory(
34-
decorated: new ClassMetadataFactory(
35-
loader: new AttributeLoader(),
36-
),
37-
cacheItemPool: $this->psr6,
38-
),
39-
propertyTypeExtractor: new PhpDocExtractor()
40-
),
41-
]));
42-
43-
$this->raw = (new Serializer([
26+
$this->serializer = (new Serializer([
4427
new ArrayDenormalizer(),
4528
new ObjectNormalizer(propertyTypeExtractor: new PhpDocExtractor()),
4629
]));
4730
}
4831

4932
public function benchNormalization(): void
5033
{
51-
$this->raw->normalize($this->denormalized);
52-
}
53-
54-
public function benchCachedNormalization(): void
55-
{
56-
$this->cached->normalize($this->denormalized);
34+
$this->serializer->normalize($this->denormalized);
5735
}
5836

5937
public function benchDenormalization(): void
6038
{
61-
$this->raw->denormalize(self::NORMALIZED, ExampleRequestDTO::class);
62-
}
63-
64-
public function benchCachedDenormalization(): void
65-
{
66-
$this->cached->denormalize(self::NORMALIZED, ExampleRequestDTO::class);
39+
$this->serializer->denormalize(self::NORMALIZED, ExampleRequestDTO::class);
6740
}
6841
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Bench\Serializers;
6+
7+
use PhpBench\Attributes\BeforeMethods;
8+
use PhpBench\Attributes\Iterations;
9+
use PhpBench\Attributes\Revs;
10+
use PhpBench\Attributes\Warmup;
11+
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
12+
use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory;
13+
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
14+
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
15+
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
16+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
17+
use Symfony\Component\Serializer\Serializer;
18+
use TypeLang\Mapper\Bench\Stub\ExampleRequestDTO;
19+
20+
#[Revs(100), Warmup(3), Iterations(5), BeforeMethods('prepare')]
21+
final class SymfonyDocBlockWithSymfonyPsr6Bench extends MapperBenchmark
22+
{
23+
private readonly Serializer $serializer;
24+
25+
public function prepare(): void
26+
{
27+
parent::prepare();
28+
29+
$this->serializer = (new Serializer([
30+
new ArrayDenormalizer(),
31+
new ObjectNormalizer(
32+
classMetadataFactory: new CacheClassMetadataFactory(
33+
decorated: new ClassMetadataFactory(
34+
loader: new AttributeLoader(),
35+
),
36+
cacheItemPool: $this->createPsr6Cache('symfony'),
37+
),
38+
propertyTypeExtractor: new PhpDocExtractor()
39+
),
40+
]));
41+
}
42+
43+
public function benchNormalization(): void
44+
{
45+
$this->serializer->normalize($this->denormalized);
46+
}
47+
48+
public function benchDenormalization(): void
49+
{
50+
$this->serializer->denormalize(self::NORMALIZED, ExampleRequestDTO::class);
51+
}
52+
}

0 commit comments

Comments
 (0)