Производительность поэлементного присвоения в массив лучше со спредом или без?
Есть конфиг 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 шт):
Не получилосъ найти ответ на твой вопрос на просторах интернета, поэтому написал неболъшой бенчмарк:
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