Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Commit d1cc740

Browse files
committed
Added benchmarks from #4
This patch adds the benchmark scripts from #4 in order to allow us to determine changes in performance from v2 to the proposed v3.
1 parent fb3ab06 commit d1cc740

11 files changed

+364
-2
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,15 @@ and interrupt execution of listeners.
1616

1717
- File issues at https://github.com/zendframework/zend-eventmanager/issues
1818
- Documentation is at http://framework.zend.com/manual/current/en/index.html#zend-eventmanager
19+
20+
## Benchmarks
21+
22+
We provide scripts for benchmarking zend-eventmanager using the
23+
[Athletic](https://github.com/polyfractal/athletic) framework; these can be
24+
found in the `benchmarks/` directory.
25+
26+
To execute the benchmarks you can run the following command:
27+
28+
```bash
29+
$ vendor/bin/athletic -p benchmarks
30+
```
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\SharedEventManager;
6+
use Zend\EventManager\EventManager;
7+
use Athletic\AthleticEvent;
8+
9+
class MultipleEventIndividualSharedListener extends AthleticEvent
10+
{
11+
use TraitEventBench;
12+
13+
private $sharedEvents;
14+
15+
private $events;
16+
17+
private $eventsToTrigger;
18+
19+
public function setUp()
20+
{
21+
$identifiers = $this->getIdentifierList();
22+
$this->sharedEvents = new SharedEventManager();
23+
foreach ($this->getEventList() as $event) {
24+
$this->sharedEvents->attach($identifiers[0], $event, $this->generateCallback());
25+
}
26+
$this->events = new EventManager();
27+
$this->events->setSharedManager($this->sharedEvents);
28+
$this->events->setIdentifiers([$identifiers[0]]);
29+
30+
$this->eventsToTrigger = array_filter($this->getEventList(), function ($value) {
31+
return ($value !== '*');
32+
});
33+
}
34+
35+
/**
36+
* Trigger the event list
37+
*
38+
* @iterations 5000
39+
*/
40+
public function trigger()
41+
{
42+
foreach ($this->eventsToTrigger as $event) {
43+
$this->events->trigger($event);
44+
}
45+
}
46+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\EventManager;
6+
use Athletic\AthleticEvent;
7+
8+
class MultipleEventLocalListener extends AthleticEvent
9+
{
10+
use TraitEventBench;
11+
12+
private $eventsToTrigger;
13+
14+
public function setUp()
15+
{
16+
$this->events = new EventManager();
17+
18+
$this->eventsToTrigger = array_filter($this->getEventList(), function ($value) {
19+
return ($value !== '*');
20+
});
21+
}
22+
23+
/**
24+
* Attach and trigger the event list
25+
*
26+
* @iterations 5000
27+
*/
28+
public function trigger()
29+
{
30+
foreach ($this->eventsToTrigger as $event) {
31+
$this->events->attach($event, $this->generateCallback());
32+
$this->events->trigger($event);
33+
}
34+
}
35+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\SharedEventManager;
6+
use Zend\EventManager\EventManager;
7+
use Athletic\AthleticEvent;
8+
9+
class MultipleEventMultipleLocalAndSharedListener extends AthleticEvent
10+
{
11+
use TraitEventBench;
12+
13+
private $sharedEvents;
14+
15+
private $events;
16+
17+
private $eventsToTrigger;
18+
19+
public function setUp()
20+
{
21+
$identifiers = $this->getIdentifierList();
22+
$this->sharedEvents = new SharedEventManager();
23+
foreach ($this->getIdentifierList() as $identifier) {
24+
foreach ($this->getEventList() as $event) {
25+
$this->sharedEvents->attach($identifier, $event, $this->generateCallback());
26+
}
27+
}
28+
$this->events = new EventManager();
29+
$this->events->setSharedManager($this->sharedEvents);
30+
$this->events->setIdentifiers($identifiers);
31+
32+
$this->eventsToTrigger = array_filter($this->getEventList(), function ($value) {
33+
return ($value !== '*');
34+
});
35+
}
36+
37+
/**
38+
* Attach and trigger the event list
39+
*
40+
* @iterations 5000
41+
*/
42+
public function trigger()
43+
{
44+
foreach ($this->eventsToTrigger as $event) {
45+
for ($i = 0; $i < $this->numListeners; $i += 1) {
46+
$this->events->attach($event, $this->generateCallback());
47+
}
48+
$this->events->trigger($event);
49+
}
50+
}
51+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\SharedEventManager;
6+
use Zend\EventManager\EventManager;
7+
use Athletic\AthleticEvent;
8+
9+
class MultipleEventMultipleSharedListener extends AthleticEvent
10+
{
11+
use TraitEventBench;
12+
13+
private $sharedEvents;
14+
15+
private $events;
16+
17+
private $eventsToTrigger;
18+
19+
public function setUp()
20+
{
21+
$identifiers = $this->getIdentifierList();
22+
$this->sharedEvents = new SharedEventManager();
23+
foreach ($this->getIdentifierList() as $identifier) {
24+
foreach ($this->getEventList() as $event) {
25+
$this->sharedEvents->attach($identifier, $event, $this->generateCallback());
26+
}
27+
}
28+
$this->events = new EventManager();
29+
$this->events->setSharedManager($this->sharedEvents);
30+
$this->events->setIdentifiers($identifiers);
31+
32+
$this->eventsToTrigger = array_filter($this->getEventList(), function ($value) {
33+
return ($value !== '*');
34+
});
35+
}
36+
37+
/**
38+
* Trigger the event list
39+
*
40+
* @iterations 5000
41+
*/
42+
public function trigger()
43+
{
44+
foreach ($this->eventsToTrigger as $event) {
45+
$this->events->trigger($event);
46+
}
47+
}
48+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\EventManager;
6+
use Athletic\AthleticEvent;
7+
8+
class SingleEventMultipleListener extends AthleticEvent
9+
{
10+
use TraitEventBench;
11+
12+
private $events;
13+
14+
public function setUp()
15+
{
16+
$this->events = new EventManager();
17+
for ($i = 0; $i < $this->numListeners; $i++) {
18+
$this->events->attach('dispatch', $this->generateCallback());
19+
}
20+
}
21+
22+
/**
23+
* Trigger the dispatch event
24+
*
25+
* @iterations 5000
26+
*/
27+
public function trigger()
28+
{
29+
$this->events->trigger('dispatch');
30+
}
31+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\SharedEventManager;
6+
use Zend\EventManager\EventManager;
7+
use Athletic\AthleticEvent;
8+
9+
class SingleEventMultipleSharedListener extends AthleticEvent
10+
{
11+
use TraitEventBench;
12+
13+
private $sharedEvents;
14+
15+
private $events;
16+
17+
public function setUp()
18+
{
19+
$identifiers = $this->getIdentifierList();
20+
$this->sharedEvents = new SharedEventManager();
21+
for ($i = 0; $i < $this->numListeners; $i += 1) {
22+
$this->sharedEvents->attach($identifiers[0], 'dispatch', $this->generateCallback());
23+
}
24+
$this->events = new EventManager();
25+
$this->events->setSharedManager($this->sharedEvents);
26+
$this->events->setIdentifiers([$identifiers[0]]);
27+
}
28+
29+
/**
30+
* Trigger the dispatch event
31+
*
32+
* @iterations 5000
33+
*/
34+
public function trigger()
35+
{
36+
$this->events->trigger('dispatch');
37+
}
38+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\EventManager;
6+
use Athletic\AthleticEvent;
7+
8+
class SingleEventSingleListener extends AthleticEvent
9+
{
10+
use TraitEventBench;
11+
12+
private $events;
13+
14+
public function setUp()
15+
{
16+
$this->events = new EventManager();
17+
$this->events->attach('dispatch', $this->generateCallback());
18+
}
19+
20+
/**
21+
* Trigger the dispatch event
22+
*
23+
* @iterations 5000
24+
*/
25+
public function trigger()
26+
{
27+
$this->events->trigger('dispatch');
28+
}
29+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace ZendBench\EventManager;
4+
5+
use Zend\EventManager\SharedEventManager;
6+
use Zend\EventManager\EventManager;
7+
use Athletic\AthleticEvent;
8+
9+
class SingleEventSingleSharedListener extends AthleticEvent
10+
{
11+
use TraitEventBench;
12+
13+
private $sharedEvents;
14+
15+
private $events;
16+
17+
public function setUp()
18+
{
19+
$identifiers = $this->getIdentifierList();
20+
$this->sharedEvents = new SharedEventManager();
21+
$this->sharedEvents->attach($identifiers[0], 'dispatch', $this->generateCallback());
22+
$this->events = new EventManager();
23+
$this->events->setSharedManager($this->sharedEvents);
24+
$this->events->setIdentifiers([$identifiers[0]]);
25+
}
26+
27+
/**
28+
* Trigger the dispatch event
29+
*
30+
* @iterations 5000
31+
*/
32+
public function trigger()
33+
{
34+
$this->events->trigger('dispatch');
35+
}
36+
}

benchmarks/TraitEventBench.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
namespace ZendBench\EventManager;
3+
4+
trait TraitEventBench
5+
{
6+
private $numListeners = 50;
7+
8+
private function generateCallback()
9+
{
10+
return function ($e) {
11+
};
12+
}
13+
14+
private function getEventList()
15+
{
16+
return [
17+
'dispatch',
18+
'dispatch.post',
19+
'*',
20+
];
21+
}
22+
23+
private function getIdentifierList()
24+
{
25+
return [
26+
'Zend\Stdlib\DispatchableInterface',
27+
'Zend\Mvc\Controller\AbstractController',
28+
'Zend\Mvc\Controller\AbstractActionController',
29+
'Zend\Mvc\Controller\AbstractRestfulController',
30+
'ZF\Rest\RestController',
31+
'CustomRestController',
32+
];
33+
}
34+
}

composer.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
},
1515
"require": {
1616
"php": ">=5.5",
17-
"zendframework/zend-stdlib": "~2.5"
17+
"zendframework/zend-stdlib": "~2.5",
18+
"athletic/athletic": "dev-master"
1819
},
1920
"minimum-stability": "dev",
2021
"prefer-stable": true,
@@ -26,7 +27,8 @@
2627
},
2728
"autoload-dev": {
2829
"psr-4": {
29-
"ZendTest\\EventManager\\": "test/"
30+
"ZendTest\\EventManager\\": "test/",
31+
"ZendBench\\EventManager\\": "benchmarks/"
3032
}
3133
},
3234
"require-dev": {

0 commit comments

Comments
 (0)