Skip to content

Commit 5544b89

Browse files
committed
EnumSet: micro optimization
1 parent c9e8061 commit 5544b89

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

bench/EnumSet32Bench.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,16 @@ public function benchSymDiff()
169169
$this->fullSet->symDiff($this->emptySet);
170170
}
171171

172-
public function benchGetOrdinals()
172+
public function benchGetOrdinalsFull()
173173
{
174174
$this->fullSet->getOrdinals();
175175
}
176176

177+
public function benchGetOrdinalsEmpty()
178+
{
179+
$this->emptySet->getOrdinals();
180+
}
181+
177182
public function benchGetValues()
178183
{
179184
$this->fullSet->getValues();

bench/EnumSet66Bench.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,16 @@ public function benchSymDiff()
197197
$this->fullSet->symDiff($this->emptySet);
198198
}
199199

200-
public function benchGetOrdinals()
200+
public function benchGetOrdinalsFull()
201201
{
202202
$this->fullSet->getOrdinals();
203203
}
204204

205+
public function benchGetOrdinalsEmpty()
206+
{
207+
$this->emptySet->getOrdinals();
208+
}
209+
205210
public function benchGetValues()
206211
{
207212
$this->fullSet->getValues();

src/EnumSet.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,16 @@ public function count()
265265
*/
266266
private function doCountBin()
267267
{
268-
$count = 0;
269-
$byteLen = strlen($this->bitset);
268+
$count = 0;
269+
$bitset = $this->bitset;
270+
$byteLen = strlen($bitset);
270271
for ($bytePos = 0; $bytePos < $byteLen; ++$bytePos) {
271-
if ($this->bitset[$bytePos] === "\0") {
272+
if ($bitset[$bytePos] === "\0") {
272273
// fast skip null byte
273274
continue;
274275
}
275276

276-
$ord = ord($this->bitset[$bytePos]);
277+
$ord = ord($bitset[$bytePos]);
277278
for ($bitPos = 0; $bitPos < 8; ++$bitPos) {
278279
if ($ord & (1 << $bitPos)) {
279280
++$count;
@@ -468,14 +469,15 @@ public function getOrdinals()
468469
private function doGetOrdinalsBin()
469470
{
470471
$ordinals = [];
471-
$byteLen = strlen($this->bitset);
472+
$bitset = $this->bitset;
473+
$byteLen = strlen($bitset);
472474
for ($bytePos = 0; $bytePos < $byteLen; ++$bytePos) {
473-
if ($this->bitset[$bytePos] === "\0") {
475+
if ($bitset[$bytePos] === "\0") {
474476
// fast skip null byte
475477
continue;
476478
}
477479

478-
$ord = ord($this->bitset[$bytePos]);
480+
$ord = ord($bitset[$bytePos]);
479481
for ($bitPos = 0; $bitPos < 8; ++$bitPos) {
480482
if ($ord & (1 << $bitPos)) {
481483
$ordinals[] = $bytePos * 8 + $bitPos;
@@ -496,9 +498,11 @@ private function doGetOrdinalsBin()
496498
*/
497499
private function doGetOrdinalsInt()
498500
{
499-
$ordinals = [];
500-
for ($ord = 0; $ord < $this->ordinalMax; ++$ord) {
501-
if ($this->bitset & (1 << $ord)) {
501+
$ordinals = [];
502+
$ordinalMax = $this->ordinalMax;
503+
$bitset = $this->bitset;
504+
for ($ord = 0; $ord < $ordinalMax; ++$ord) {
505+
if ($bitset & (1 << $ord)) {
502506
$ordinals[] = $ord;
503507
}
504508
}

0 commit comments

Comments
 (0)