Size: a a a

2020 January 28

KN

Kirill Nesmeyanov in PHP
например раньше для ref было отдельное поле в структуре, сейчас это отдельный тип
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
профит у пхп7 - другой zval в том числе
основной профит - это более эффективная работа с памятью. В том числе за счет уменьшения размера структур и локализации оных (куча структур на указателях которые валяются в разных местах в памяти будут приводить к большему количеству кэш мисов)
источник

SP

Sergey Protko in PHP
грубо говоря тут работает принцип локальности данных и выбор структур под это дело
источник

KN

Kirill Nesmeyanov in PHP
осталось рассказать про предсказания проца и всё, можно уносить
источник

KN

Kirill Nesmeyanov in PHP
кстати!
источник

KN

Kirill Nesmeyanov in PHP
т.к. для рефов отдельный тип, то по-идее ассерты тайпхинтов для референсов идут по графу таблицы
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
осталось рассказать про предсказания проца и всё, можно уносить
предсказания работают на конвеер инструкций. то есть "обойти проверку" у тебя не выйдет. Это оптимизация больше на позитивный сценарий что проверка даст тот же результат и инструкции в конвеере останутся без изменений.
источник

SP

Sergey Protko in PHP
рассказал?)
источник

KN

Kirill Nesmeyanov in PHP
и чем больше цепока "передач по ссылкам" - тем медленнее работают проверки
источник

KN

Kirill Nesmeyanov in PHP
Sergey Protko
рассказал?)
не, нихрена
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
т.к. для рефов отдельный тип, то по-идее ассерты тайпхинтов для референсов идут по графу таблицы
без понятия. я не люблю строить причинно следственные связи вот таким вот образом
источник

KN

Kirill Nesmeyanov in PHP
если простыми словами, то в php7 соптимизили некоторый код для того, чтобы он не прыгал от инструкции к инструкции, а шёл по порядку
источник

SP

Sergey Protko in PHP
Fogr
Одна проблема, работает такой подход не быстро :(
если нужна проверка быстрее не сделать (быстрее только phpdoc + psalm который проверят это дело в компайл тайме)
источник

KN

Kirill Nesmeyanov in PHP
точнее наооборот, сдеоптимизили (по объёму)
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
если простыми словами, то в php7 соптимизили некоторый код для того, чтобы он не прыгал от инструкции к инструкции, а шёл по порядку
хуйню какую-то сказал)
источник

F

Fogr in PHP
Fogr
добрался до компа, по опкодам отличия между передачей по ссылке и просто передачей не увидел, по времени тоже - оба варианта медленнее, чем передача просто массива без распаковок / запаковок, вот пример кода:
<?php
declare(strict_types=1);

class Test {
}

function countTests(Test &...$tests) {
   return count($tests);
}

$tests = [];
for ($i = 0; $i < 100; $i++) {
   $tests[] = new Test();
}

$begin = microtime(true);
for ($i = 0; $i < 100000; $i++) {
   countTests(...$tests);
}
echo 'Time: ' . round(microtime(true) - $begin, 3) . "\n";
может я что-то не так понял?
вот дифф по опкодам:
3c3
<     ; testArray.php:1-21
---
>     ; testUnpack.php:1-21
27,28c27,28
< L23 (18):   INIT_FCALL 1 112 string("counttests")
< L24 (18):   SEND_VAR CV0($tests) 1
---
> L23 (18):   INIT_FCALL 0 112 string("counttests")
> L24 (18):   SEND_UNPACK CV0($tests)
51c51
< countTests: ; (lines=5, args=1, vars=1, tmps=1)
---
> countTests: ; (lines=5, args=0, vars=1, tmps=1)
53c53
<     ; testArray.php:7-9
---
>     ; testUnpack.php:7-9
55c55
< L1 (7):     CV0($tests) = RECV 1
---
> L1 (7):     CV0($tests) = RECV_VARIADIC 1
59c59
< Time: 0.069
---
> Time: 0.323
источник

KN

Kirill Nesmeyanov in PHP
Sergey Protko
хуйню какую-то сказал)
эту хуйню стогов мне рассказывал
источник

KN

Kirill Nesmeyanov in PHP
так что ты это, ща на священное наезжаешь
источник

SP

Sergey Protko in PHP
ты ж понимаешь что слова великих людей из уст верстальщиков могут чуть смысла потерять по пути?)
источник

KN

Kirill Nesmeyanov in PHP
Я думаешь помню какие конкретно инструкции VM переписывали?
источник