Производительность поэлементного присвоения в массив лучше со спредом или без?

Есть конфиг Mediawiki, он как известно поднимается на каждый или почти на каждый запрос. Поэтому вопрос производительности этого конфига критичен.

В этом конфиге я кастомизирую набор прав доступа у групп пользователей.

Есть группа прав user, у которой есть какие-то дефолтные права и на момент прогрузки конфига она уже существует, затем я набор её прав модифицирую.

$wgGroupPermissions['user']['viewmyprivateinfo'] = true;
$wgGroupPermissions['user']['editmyprivateinfo'] = true;
$wgGroupPermissions['user']['editmyoptions'] = true;
$wgGroupPermissions['user']['edit'] = false;
$wgGroupPermissions['user']['createpage'] = false;
$wgGroupPermissions['user']['createtalk'] = false;
$wgGroupPermissions['user']['editmyusercss'] = false;
$wgGroupPermissions['user']['editmyuserjs'] = false;
$wgGroupPermissions['user']['sendemail'] = false;
$wgGroupPermissions['user']['upload'] = false;
$wgGroupPermissions['user']['reupload-shared'] = false;
$wgGroupPermissions['user']['writeapi'] = false;
$wgGroupPermissions['user']['minoredit'] = false;
$wgGroupPermissions['user']['reupload'] = false;
$wgGroupPermissions['user']['move-rootuserpages'] = false;
$wgGroupPermissions['user']['move'] = false;
$wgGroupPermissions['user']['move-categorypages'] = false;
$wgGroupPermissions['user']['move-subpages'] = false;
$wgGroupPermissions['user']['movefile'] = false;
$wgGroupPermissions['user']['applychangetags'] = false;
$wgGroupPermissions['user']['editcontentmodel'] = false;
$wgGroupPermissions['user']['editmyuserjson'] = false;
$wgGroupPermissions['user']['editmyuserjsredirect'] = false;
$wgGroupPermissions['user']['changetags'] = false;

Именно так это предлагается делать в документации по Mediawiki.

Но потом проходя в сотый раз мимо этого столба кода, я решил, что можно переписать вот так:

$wgGroupPermissions['user'] = [
    ...$wgGroupPermissions['user'],
    'viewmyprivateinfo' => true,
    'editmyprivateinfo' => true,
    'editmyoptions' => true,
    'edit' => false,
    'createpage' => false,
    'createtalk' => false,
    'editmyusercss' => false,
    'editmyuserjs' => false,
    'sendemail' => false,
    'upload' => false,
    'reupload-shared' => false,
    'writeapi' => false,
    'minoredit' => false,
    'reupload' => false,
    'move-rootuserpages' => false,
    'move' => false,
    'move-categorypages' => false,
    'move-subpages' => false,
    'movefile' => false,
    'applychangetags' => false,
    'editcontentmodel' => false,
    'editmyuserjson' => false,
    'editmyuserjsredirect' => false,
    'changetags' => false,
];

С точки зрения читабельности такой вариант выглядит значительно прикольнее. С точки зрения работоспособности оба варианта работают как надо.

Вопрос: не сделал ли я хуже по производительности или по памяти?

PHP-FPM 8.3 + Nginx + Debian @ Docker


Ответы (1 шт):

Автор решения: ra0ued

Не получилосъ найти ответ на твой вопрос на просторах интернета, поэтому написал неболъшой бенчмарк:

header('Content-Type', 'text/plain');

$startTime = microtime(true);

const attempts = 100000;

for ($i = 0; $i < attempts; $i++) {
    $wgGroupPermissions = ['user' => []];

    $wgGroupPermissions['user']['viewmyprivateinfo'] = true;
    $wgGroupPermissions['user']['editmyprivateinfo'] = true;
    $wgGroupPermissions['user']['editmyoptions'] = true;
    $wgGroupPermissions['user']['edit'] = false;
    $wgGroupPermissions['user']['createpage'] = false;
    $wgGroupPermissions['user']['createtalk'] = false;
    $wgGroupPermissions['user']['editmyusercss'] = false;
    $wgGroupPermissions['user']['editmyuserjs'] = false;
    $wgGroupPermissions['user']['sendemail'] = false;
    $wgGroupPermissions['user']['upload'] = false;
    $wgGroupPermissions['user']['reupload-shared'] = false;
    $wgGroupPermissions['user']['writeapi'] = false;
    $wgGroupPermissions['user']['minoredit'] = false;
    $wgGroupPermissions['user']['reupload'] = false;
    $wgGroupPermissions['user']['move-rootuserpages'] = false;
    $wgGroupPermissions['user']['move'] = false;
    $wgGroupPermissions['user']['move-categorypages'] = false;
    $wgGroupPermissions['user']['move-subpages'] = false;
    $wgGroupPermissions['user']['movefile'] = false;
    $wgGroupPermissions['user']['applychangetags'] = false;
    $wgGroupPermissions['user']['editcontentmodel'] = false;
    $wgGroupPermissions['user']['editmyuserjson'] = false;
    $wgGroupPermissions['user']['editmyuserjsredirect'] = false;
    $wgGroupPermissions['user']['changetags'] = false;

    unset($wgGroupPermissions);
}

$endTime = microtime(true) - $startTime;

echo $endTime . PHP_EOL;
echo memory_get_usage() . PHP_EOL;

$startTime = microtime(true);

for ($i = 0; $i < attempts; $i++) {
    $wgGroupPermissions = ['user' => []];

    $wgGroupPermissions['user'] = [
        ...$wgGroupPermissions['user'],
        'viewmyprivateinfo' => true,
        'editmyprivateinfo' => true,
        'editmyoptions' => true,
        'edit' => false,
        'createpage' => false,
        'createtalk' => false,
        'editmyusercss' => false,
        'editmyuserjs' => false,
        'sendemail' => false,
        'upload' => false,
        'reupload-shared' => false,
        'writeapi' => false,
        'minoredit' => false,
        'reupload' => false,
        'move-rootuserpages' => false,
        'move' => false,
        'move-categorypages' => false,
        'move-subpages' => false,
        'movefile' => false,
        'applychangetags' => false,
        'editcontentmodel' => false,
        'editmyuserjson' => false,
        'editmyuserjsredirect' => false,
        'changetags' => false,
    ];

    unset($wgGroupPermissions);
}

$endTime = microtime(true) - $startTime;

echo $endTime . PHP_EOL;
echo memory_get_usage() . PHP_EOL;
exit;

И вариант со спредом получился производителънее по времени:

0.02248477935791
347272
0.014714956283569
347272

Но толъко при условии, что мы каждый раз вызываем unset() для нашего набора данных. По памяти у обоих вариантов потребление одинаковое, скорее всего, это связано с количеством элементов в массиве. Если же unset() убратъ и вынести инициализацию массива из цикла, то картина меняется так:

0.013426780700684
349288
0.01802396774292
349288
→ Ссылка