Skip to content

Commit 9a28ddc

Browse files
martinsikdavidwdan
authored andcommitted
refactored benchmark runner
1 parent d6365d2 commit 9a28ddc

File tree

13 files changed

+137
-97
lines changed

13 files changed

+137
-97
lines changed

benchmark/bufferWithCount/bufferWithCount.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
use Rx\Observable;
44

5-
return function() use ($dummyObserver) {
6-
Observable::range(0, 25)
7-
->bufferWithCount(5)
8-
->subscribe($dummyObserver);
9-
};
5+
$source = Observable::range(0, 25)
6+
->bufferWithCount(5);
7+
8+
return function() use ($source) {
9+
return $source;
10+
};

benchmark/bufferWithCount/bufferWithCount_eventloop.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
$loop = new StreamSelectLoop();
88
$scheduler = new EventLoopScheduler($loop);
9+
$source = Observable::range(0, 25, $scheduler)
10+
->bufferWithCount(5);
911

10-
return function() use ($dummyObserver, $scheduler, $loop) {
11-
Observable::range(0, 25)
12-
->bufferWithCount(5)
13-
->subscribe($dummyObserver, $scheduler);
12+
$factory = function() use ($source, $scheduler) {
13+
return $source;
14+
};
1415

15-
$loop->run();
16-
};
16+
return [$factory, $loop];

benchmark/distinct/distinct.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
use Rx\Observable;
44

5-
$source = array_map(function($val) {
5+
$range = array_map(function($val) {
66
return $val % 3;
77
}, range(0, 25));
88

9-
return function() use ($source, $dummyObserver) {
10-
Observable::fromArray($source)
11-
->distinct()
12-
->subscribe($dummyObserver);
13-
};
9+
$source = Observable::fromArray($range)
10+
->distinct();
11+
12+
return function() use ($source) {
13+
return $source;
14+
};
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
<?php
22

33
use Rx\Observable;
4+
use Rx\Observable\ArrayObservable;
45
use Rx\Scheduler\EventLoopScheduler;
56
use React\EventLoop\StreamSelectLoop;
67

78
$loop = new StreamSelectLoop();
89
$scheduler = new EventLoopScheduler($loop);
910

10-
$source = array_map(function($val) {
11+
$range = array_map(function($val) {
1112
return $val % 3;
1213
}, range(0, 25));
1314

14-
return function() use ($source, $dummyObserver, $scheduler, $loop) {
15-
Observable::fromArray($source)
16-
->distinct()
17-
->subscribe($dummyObserver, $scheduler);
15+
$source = (new ArrayObservable($range, $scheduler))
16+
->distinct();
1817

19-
$loop->run();
20-
};
18+
$factory = function() use ($source) {
19+
return $source;
20+
};
21+
22+
return [$factory, $loop];

benchmark/filter/filter.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
use Rx\Observable;
44

5-
return function() use ($dummyObserver) {
6-
Observable::range(0, 50)
7-
->filter(function($value) {
8-
return $value % 2 == 0;
9-
})
10-
->filter(function($value) {
11-
return $value % 10 == 0;
12-
})
13-
->subscribe($dummyObserver);
14-
};
5+
$source = Observable::range(0, 50)
6+
->filter(function($value) {
7+
return $value % 2 == 0;
8+
})
9+
->filter(function($value) {
10+
return $value % 10 == 0;
11+
});
12+
13+
return function() use ($source) {
14+
return $source;
15+
};

benchmark/filter/filter_eventloop.php

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
$loop = new StreamSelectLoop();
88
$scheduler = new EventLoopScheduler($loop);
99

10-
return function() use ($dummyObserver, $scheduler, $loop) {
11-
Observable::range(0, 50)
12-
->filter(function($value) {
13-
return $value % 2 == 0;
14-
})
15-
->filter(function($value) {
16-
return $value % 10 == 0;
17-
})
18-
->subscribe($dummyObserver, $scheduler);
10+
$source = Observable::range(0, 50, $scheduler)
11+
->filter(function($value) {
12+
return $value % 2 == 0;
13+
})
14+
->filter(function($value) {
15+
return $value % 10 == 0;
16+
});
1917

20-
$loop->run();
21-
};
18+
$factory = function() use ($source) {
19+
return $source;
20+
};
21+
22+
return [$factory, $loop];

benchmark/run.php

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
use Rx\Observable;
1111
use Rx\Observer\CallbackObserver;
12+
use React\EventLoop\LoopInterface;
1213

1314
// Check whether XDebug is enabled
1415
if (in_array('Xdebug', get_loaded_extensions(true))) {
@@ -47,37 +48,64 @@
4748
printf('%s', pathinfo($file, PATHINFO_FILENAME));
4849
})
4950
->map(function($file) { // Run benchmark
50-
$totalDuration = 0.0;
5151
$durations = [];
52+
/** @var Observable $observable */
53+
$observable = null;
54+
/** @var LoopInterface $loop */
55+
$loop = null;
56+
/** @var callable(): Observable $sourceFactory */
57+
$sourceFactory = null;
5258

5359
ob_start();
5460

55-
$dummyObserver = new Rx\Observer\CallbackObserver(
56-
function ($value) { },
57-
function ($error) { },
58-
function () { }
59-
);
61+
$testDef = @include $file;
6062

61-
$testClosure = @include $file;
62-
if (!$testClosure) {
63-
throw new Exception("Unable to load file \"$file\"");
63+
if (is_array($testDef)) {
64+
$sourceFactory = $testDef[0];
65+
$loop = $testDef[1];
66+
} elseif (is_callable($testDef)) {
67+
$sourceFactory = $testDef;
68+
} else {
69+
throw new Exception("File \"$file\" doesn't contain a valid benchmark");
6470
}
6571

6672
$memoryUsage = [memory_get_usage()];
6773

68-
while ($totalDuration < MIN_TOTAL_DURATION) {
69-
$start = microtime(true);
70-
71-
$testClosure();
72-
73-
$duration = microtime(true) - $start;
74+
$benchmarkLoop = function(Observable $observable) use (&$durations, &$memoryUsage) {
75+
$dummyObserver = new Rx\Observer\CallbackObserver(
76+
function ($value) { },
77+
function ($error) { },
78+
function () use (&$start, &$durations) {
79+
$durations[] = (microtime(true) - $start) * 1000;
80+
}
81+
);
7482

75-
$durations[] = $duration * 1000;
76-
$totalDuration += $duration;
83+
$start = microtime(true);
84+
$observable->subscribe($dummyObserver);
7785

7886
if (count($durations) === 100) {
7987
$memoryUsage[] = memory_get_usage();
8088
}
89+
};
90+
91+
$stopStartTime = microtime(true) + MIN_TOTAL_DURATION;
92+
93+
if ($loop) {
94+
$reschedule = function() use (&$reschedule, $benchmarkLoop, $sourceFactory, $loop, $stopStartTime) {
95+
$loop->futureTick(function () use (&$reschedule, $benchmarkLoop, $stopStartTime, $sourceFactory) {
96+
$benchmarkLoop($sourceFactory());
97+
if ($stopStartTime > microtime(true)) {
98+
$reschedule();
99+
}
100+
});
101+
};
102+
103+
$reschedule();
104+
$loop->run();
105+
} else {
106+
while ($stopStartTime > microtime(true)) {
107+
$benchmarkLoop($sourceFactory());
108+
}
81109
}
82110

83111
$memoryUsage[] = memory_get_usage();

benchmark/skipLast/skipLast.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
use Rx\Observable;
44

5-
return function() use ($dummyObserver) {
6-
Observable::range(0, 500)
7-
->skipLast(50)
8-
->subscribe($dummyObserver);
9-
};
5+
$source = Observable::range(0, 500)
6+
->skipLast(50);
7+
8+
return function() use ($source) {
9+
return $source;
10+
};

benchmark/skipLast/skipLast_eventloop.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
$loop = new StreamSelectLoop();
88
$scheduler = new EventLoopScheduler($loop);
99

10-
return function() use ($dummyObserver, $scheduler, $loop) {
11-
Observable::range(0, 500)
12-
->skipLast(50)
13-
->subscribe($dummyObserver, $scheduler);
10+
$source = Observable::range(0, 500, $scheduler)
11+
->skipLast(50);
1412

15-
$loop->run();
16-
};
13+
$factory = function() use ($source) {
14+
return $source;
15+
};
16+
17+
return [$factory, $loop];

benchmark/takeLast/takeLast.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
use Rx\Observable;
44

5-
return function() use ($dummyObserver) {
6-
Observable::range(0, 500)
7-
->takeLast(50)
8-
->subscribe($dummyObserver);
5+
$source = Observable::range(0, 500)
6+
->takeLast(50);
7+
8+
return function() use ($source) {
9+
return $source;
910
};

0 commit comments

Comments
 (0)