57
Confidenal - © All rights reserved. Zend Technologies, Inc. 1 Copyright - © All rights reserved. Zend Technologies, Inc. Анализ внутренних изменений PHP 7 Dmitry Stogov CodeFest 2016, Новосибирск Principal Engineer at Zend Technologies

Дмитрий Стогов

Embed Size (px)

Citation preview

Page 1: Дмитрий Стогов

Confidential - © All rights reserved. Zend Technologies, Inc.1 Copyright - © All rights reserved. Zend Technologies, Inc.

Анализ внутренних изменений PHP 7

Dmitry Stogov

CodeFest 2016, Новосибирск

Principal Engineer at Zend Technologies

Page 2: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.2

PHP – Personal Home Page

● Инструмент для создания персональных веб-страниц● Первый релиз PHP/FI 2.0 от Rasmus Lerdorf 8 июня 1995● В 1998 Andi Gutmans и Zeev Suraski выпустили PHP 3● PHP 4 основанный на Zend Engine вышел в 2000● PHP 5 с переработанным функционалом ООП вышел в 2004● ZendFramework в 2007● Сегодня более 70% сайтов интернета используют PHP● C 2010 Facebook работает над альтернативной реализацией - HHVM● В декабре 2015 вышел PHP 7

Page 3: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.3

Кто Я?

● Работаю в ИТ с 1991● Первое знакомство с PHP в 2002● Автор Turck MMCache (eAccelerator)● Работаю в Zend Technologies с 2004● Сейчас ведущий инженер● Автор ext/soap и pecl/perl● Один из ведущих разработчиков Open Source PHP● Майнтейнер Zend OPcache● Лидер проекта PHPNG легшего в основу PHP 7

Page 4: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.4

Производительность PHP

0 2 4 6 8 10 12 14

12.6812.54

4.684.2

2.912.18

2.031.92

0.780.38

bench.php [sec]

4.45.0 - Jul 20045.1 - Nov 20055.2 - Nov 20065.3 - Nov 20095.4 - Mar 20125.5 - Jun 20135.6 - Aug 20147.0.0 - Dec 2015HHVM-3.10.0

secAre we there?

Page 5: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.5

PHPNG (New Generation)

● Проект получил свое развитие после попыток создания JIT для PHP● Рефакторинг (ни каких нововведений, 100% совместимость с PHP 5)● Основная цель — достичь нового уровня производительности и

заложить базу для будущих улучшений● Отделился от основной ветки PHP в январе 2014

● Две недели ушло на то что-бы просто скомпилировать ядро● Еще через две недели заработал bench.php● Полтора месяца для обеспечения совместимости с Wordpress● Еще через месяц (к 9 Мая) мы открыли проект● В августе 2014 принят как основа для будущего PHP 7

Page 6: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.6

PHP 7

● Было решено выпускать PHP 7 после PHP 5, пропустив PHP 6● GA релиз состоялся в декабре 2015● Сейчас доступен PHP-7.0.4

● Возможность определять скалярные типы аргументов функций и возвращаемых значений

● Исключения вместо фатальных ошибок● Анонимный классы● Zero-cost assert()● Новые операторы и функции (<=>, ??)● Чистка неконсистентностей

Page 7: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.7

Производительность PHP

0 50 100 150 200 250

5451

5667

769193

101232

206

WordPress-3.6.0 Home Page [req/sec]

4.45.0 - Jul 20045.1 - Nov 20055.2 - Nov 20065.3 - Nov 20095.4 - Mar 20125.5 - Jun 20135.6 - Aug 20147.0.0 - Dec 2015HHVM-3.10.0

req/sec We are here!

Page 8: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.8

zval (PHP 5)

typedef struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; struct { zend_object_handle handle; zend_object_handlers *handlers;

} obj; } value; zend_uint refcount; zend_uchar type; zend_uchar is_ref;} zval;

sizeof(zval) == 24

$a = 1; $b = $a; $c = «hello»; $d = $c;

$b$c

$a

$d

VM STACK (pointers to zvals) HEAP

string( ), rc=2

int(1), rc=2

«hello»

● read type - 2 CPU instructions● read int value - 2 CPU instructions● read string value - 3 CPU instructions

Page 9: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.9

zval (PHP 5 PHP 7)→

typedef struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; struct { zend_object_handle handle; zend_object_handlers *handlers;

} obj; } value; zend_uint refcount; zend_uchar type; zend_uchar is_ref;} zval;

sizeof(zval) == 24

typedef struct _zval_struct { union { zend_long lval; double dval; zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zval *zv; void *ptr; } value; union { struct { zend_uchar type; zend_uchar type_flags; } v; zend_uint type_info; }; uint32_t reserved;} zval;

sizeof(zval) == 16

new

Page 10: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.10

zval (PHP 5 PHP 7)→

● read type - 1 CPU instruction● read int value - 1 CPU instruction● read string value - 2 CPU instructions

$b$c

$a

$d

int(1)string( )

int(1)

string( )

VM STACK (zvals) HEAP

string, rc=2«hello»

$a = 1; $b = $a; $c = «hello»; $d = $c;

$b$c

$a

$d

VM STACK (pointers to zvals) HEAP

string( ), rc=2

int(1), rc=2

«hello»

● read type - 2 CPU instructions● read int value - 2 CPU instructions● read string value - 3 CPU instructions

Page 11: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.11

zval (PHP 5 PHP 7) Copy On Write→

● no CoW for scalars – few instructions

$b$c

$a

$d

int(2)string( )

int(1)

string( )

VM STACK (zvals) HEAP

string, rc=2«hello»

$a = 1; $b = $a; $c = «hello»; $d = $c; $b = 2;

$b$c

$a

$d

VM STACK (pointers to zvals) HEAP

string( ), rc=2

int(1), rc=1

«hello»

● CoW - hundreds CPU instructions

int(2), rc=1

Page 12: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.12

zval

type_flagsvaluetype reserved

● IS_UNDEF● IS_NULL● IS_FALSE● IS_TRUE● IS_LONG● IS_DOUBLE● IS_STRING● IS_ARRAY● IS_OBJECT● IS_RESOURCE● IS_REFERENCE● IS_INDIRECT● IS_PTR

● IS_TYPE_CONSTANT● IS_TYPE_REFCOUNTED● IS_TYPE_COLLECTABLE● IS_TYPE_COPYABLE ● IS_TYPE_IMMUTABLE

0 7 8 31 32 63

new type

old IS_BOOL

scalars

refcounted

new type

Page 13: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.13

zval (refcounted)

● IS_STRING● IS_ARRAY● IS_OBJECT● IS_RESOURCE● IS_REFERENCE

type_flagsvaluetype reserved

...typerefcount flags gc_info

0 7 8 31 32 63

Page 14: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.14

zval (string)

● IS_STR_PERSISTENT● IS_STR_INTERNED● IS_STR_PERMANENTflags

valuetype reserved

hash_valuetyperefcount flags gc_info

lenval...

0 7 8 31 32 63

Page 15: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.15

zval (array)

flagsvaluetype reserved

typerefcount flags gc_info

HashTable

● IS_ARRAY_IMMUTABLE

0 7 8 31 32 63

Page 16: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.16

PHP 5.6 PHP 7

Memory Usage 428 MB 34 MB

Time 0.49 sec 0.06 sec

$a = array();for ($i = 0; $i < 1000000; $i++) $a[$i] = array("hello");echo memory_get_usage(true);

if (in array($color, array(“red”, “yellow”, “green”)) { ...}

Immutable Arrays (Неизменяемые массивы)

Page 17: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.17

zval (object/PHP 5)

handlers

zend_class_entry *ce

typerefcount is_ref unused

zval *propertyNHashTable *guards

0 7 8 31 32 63

handle

...

...

...

HashTable *properieszval *property1...

zval

zval

HEAP

OBJECT STORE

Page 18: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.18

zval (object/PHP 7)

● IS_OBJ_DTOR_CALLED● IS_OBJ_FREE_CALLED● IS_OBJ_USE_GUARDS● IS_OBJ_HAS_GUARDS

flagsvaluetype reserved

zend_class_entry *cetyperefcount flags gc_info

zend_object_handlers *handlersHashTable *properies

...

zval property_N

zval property1

HashTable *guards (optional)

0 7 8 31 32 63

Page 19: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.19

zval (reference)

flagsvaluetype reserved

typerefcount flags gc_info

zval val

0 7 8 31 32 63

Page 20: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.20

HashTable (PHP 5.*)

nKeyLenghthash_valBucket

pDatapDataPtrpListNextpListPrevpNextpPrevarKey

pInternalPointer

nTableSize

nNextFreeElement

nTableMasknNumOfElem

pListHeadpListTailarBucketspDestructor

HashTable

nKeyLenghthash_valBucket

pDatapDataPtrpListNextpListPrevpNextpPrevarKey

typevaluezval

Bucket*Bucket*...Bucket*

«hello»

Page 21: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.21

HashTable (PHP 7)

Bucket index N...Bucket index 0

keyhash_valBucket 0

val

...

keyhash_valBucket N

val

gcflagsarData

nTableMask

nNumUsed nNumOfElem

nNextFreeElement

HashTable/zend_array

nInternalPtrnTableSize

pDestructor

string, rc=1«hello»

Page 22: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.22

HashTable

● Размер HashTable уменьшен с 72 до 56 bytes● Размер каждого Bucket-а уменьшен с 72 до 32 bytes● Пространство выделяется под все Bucket-ы сразу● Bucket.key теперь указатель на zend_string и не должен копироваться

(достаточно увеличения счетчика ссылок)● Значения элементов массива (zval) встроены в Bucket-ы и не требуют

выделения памяти ● Улучшена “data locality” => меньше промахов в кашах CPU

Page 23: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.23

zval (IS_BOOL -> IS_FALSE + IS_TRUE)

ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY){ long ret; zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);

if (Z_TYPE_P(val) == IS_BOOL)) { ret = Z_LVAL_P(val); } else { ret = i_zend_is_true(val TSRMLS_CC); FREE_OP1(); CHECK_EXCEPTION(); } if (!ret) { ZEND_VM_SET_OPCODE( opline->op2.jmp_addr); ZEND_VM_CONTINUE(); }

ZEND_VM_NEXT_OPCODE();}

ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY){ zval *val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);

if (Z_TYPE_P(val) == IS_TRUE) { ZEND_VM_SET_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (Z_TYPE_P(val) <= IS_TRUE) { ZEND_VM_SET_OPCODE(opline->op2.jmp_addr); ZEND_VM_CONTINUE(); } if (i_zend_is_true(val TSRMLS_CC)) { opline++; } else { opline = opline->op2.jmp_addr; } FREE_OP1(); ZEND_VM_JMP(opline);}

type checkvalue read

value check

type check

slow path

slow path

Page 24: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.24

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

...

...

...

Page 25: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.25

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

...

... int(3), rc=1

HEAP

Arg1:Arg2:

Page 26: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.26

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

... int(3), rc=1

int(5), rc=1

HEAP

Arg1:Arg2:

Page 27: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.27

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

CALL FRAME

...

...

...

... int(3), rc=1

int(5), rc=1

HEAP

Arg1:Arg2:

$a:$b:

Page 28: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.28

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

CALL FRAME

...

...

... int(3), rc=2

int(5), rc=1

HEAP

Arg1:Arg2:

$a:$b:

Page 29: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.29

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

CALL FRAME

...

... int(3), rc=2

int(5), rc=2

HEAP

Arg1:Arg2:

$a:$b:

Page 30: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.30

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

CALL FRAME

int(8)

... int(3), rc=2

int(5), rc=2

HEAP

Arg1:Arg2:

$a:$b:

Page 31: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.31

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

CALL FRAME

int(8)

... int(3), rc=2

int(5), rc=2

HEAP

Arg1:Arg2:

$a:$b:

Page 32: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.32

VM Calling Convention (PHP 5.*)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

SEND_VAL 3SEND_VAL 5DO_FCALL “foo”/2RETURN null

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (pointers to zvals)

...

...

...

Page 33: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.33

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

new instruction

embedded zvalsinstead of pointers

Page 34: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.34

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

CALL FRAME

...

...

...

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

Arg1:Arg2:

Page 35: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.35

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

CALL FRAME

int(3)......

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

Arg1:Arg2:

Page 36: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.36

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

CALL FRAME

int(3)int(5)...

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

Arg1:Arg2:

Page 37: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.37

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

CALL FRAME

int(3)int(5)...

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

skip first 2 instructions

Arg1, $a:Arg2, $b:

local variables already in-place

Page 38: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.38

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

CALL FRAME

int(3)int(5)int(8)

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

Arg1, $a:Arg2, $b:

Page 39: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.39

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

CALL FRAME

int(3)int(5)int(8)

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

Arg1, $a:Arg2, $b:

Page 40: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.40

VM Calling Convention (PHP 7)

RECV 1, $aRECV 2, $bADD $a,$b,TMP1RETURN TMP1

foo:

_main:

function foo($a, $b) { return $a + $b;}foo(3, 5);

VM STACK (zvals)

...SEND_VAL 3SEND_VAL 5DO_FCALLRETURN null

INIT_FCALL “foo”/2

NOTE:● func_get_arg*() changed behavior● function foo($_, $_) {} is not allowed

Page 41: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.41

Новый менеджер памяти

● В PHP 5 менеджмент памяти потребляет более 20% процессорного времени (на Wordpress)

● Новый ММ отказался от алгоритмов dlmalloc и перешел на что-то напоминающее jemalloc

● Уменьшены издержки памяти на служебную информацию● Использование поиска по битовой маске вместо обхода списков и деревьев● Лучшее использование кэшей CPU● Специализация под часто используемые размеры блоков● Полностью прозрачная реализация● Накладные расходы ММ уменьшены до 5%

Page 42: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.42

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "za|b", &value, &array, &strict) == FAILURE) {return;

}

ZEND_PARSE_PARAMETERS_START(3, 2) Z_PARAM_ZVAL(value) Z_PARAM_ARRAY(array) Z_PARAM_OPTIONAL Z_PARAM_BOOL(strict)ZEND_PARSE_PARAMETERS_END();

Быстрое API для разбора параметров

● В PHP 5 5% времени тратится на разбор параметров внутренних функций

● Для некоторых простых функций время на разбор параметров составляет более 90%

Page 43: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.43

Множество мелких усовершенствований

● Новые инструкции VM (конкатенация строк, специализация, супер-инструкции)● Некоторые внутренние функции превращены в инструкции VM (strlen, is_int)● Использование регистров CPU под регистры VM (IP и FP)● Новый API для итерации по HashTable● Оптимизация функций дублирования и удаления массивов● Использования счетчиков ссылок вместо копирования везде где можно● PCRE JIT● Оптимизация внутренних функций● Оптимизация serialize()● Уменьшение размера кода и обрабатываемых данных

Page 44: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.44

Откуда ускорение? (WordPress/PHP 5.6)

Page 45: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.45

Откуда ускорение? (WordPress/PHP 7.0)

Page 46: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.46

PHP 5.6 PHP 7.0 улучшение

VM 27% 19,494M 46% 9,005M 2 раза

alloc 22% 15,575M 5% 905M 17 раз

hash 13% 9,590M 13% 2.450M 4 раза

libc 6% 4.585M 8% 1,598M 3 раза

Total: 100% 70,798M 100% 19,462M 3.5 раз

Откуда ускорение? (WordPress)

Page 47: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.47

Производительность PHP 7

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov0

5

10

15

20

25

30

24.04 24.04 24.0422.64

18.62

16.3715.28 14.86

14.16 13.83 13.56 13.2812.58 12.39

11.67 11.48 11.08 11.04 10.88 10.69 10.5 10.4 10.4

sec

● Время исполнения 1000 запросов к Wordpress-3.6.0

● php-cgi -T 1000 /.../wordpress/index.php > /dev/null

Page 48: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.48

PHP-5.6 PHP-7.0.0 разница HHVM-3.10.0 разница

ZF1 Hello 1,144 2,557 124% 1,526 40%

ZF2 Test 258 614 138% 390 36%

Magento (home) 43 73 70% 65 11%

SugarCRM (login) 134 307 129% 204 34%

Laravel 304 553 82% 447 19%

Drupal 7 192 372 94% 331 11%

Drupal 8 428 655 94% 526 11%

Mediawiki 46 79 72% 85 -8%

Wordpress-4.1 92 222 82% 210 19%

PHP 5.6 против PHP 7.0 против HHVM

Page 49: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.49

PHP 5.6 против PHP 7.0 против HHVM

ZF1 HelloZF2 Test

Magento (home)SugarCRM (login)

LaravelDrupal 7

Drupal 8Mediawiki

Wordpress-4.1

0

0.5

1

1.5

2

2.5

3

PHP 5.6PHP 7.0HHVM 3.10.0

Page 50: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.50

PHP 5 против PHP 7 против HHVM (версия Facebook)

Page 51: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.51

Проверка в деле

Page 52: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.52

Badoo перешли на PHP 7.0 и сэкономили $1M

Page 53: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.53

Badoo перешли на PHP 7.0 и сэкономили $1M

Page 54: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.54

Badoo перешли на PHP 7.0 и сэкономили $1M

Page 55: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.55

Что дальше?

● Попробуем обойтись без революционных внутренних изменений● Анализатор потоков данных и глобальный оптимизатор для байт-кода PHP● Вывод типов● Использование типизированных инструкций (ADD, ADD_LONG, ADD_DOUBLE)● Экстра-специализация инструкций (DO_FCALL_RET, DO_FCALL_NORET)● Оптимизация диспетчеризации виртуальных инструкций (надо менять GCC)● Надо что-то делать с CALL/RETURN.● И еще раз JIT?

Page 56: Дмитрий Стогов

Copyright - © All rights reserved. Zend Technologies, Inc.56

Что дальше?

0 2 4 6 8 10 12 14

12.6812.54

4.684.2

2.912.18

2.031.92

0.780.6

0.36

bench.php [sec]

4.45.0 - Jul 20045.1 - Nov 20055.2 - Nov 20065.3 - Nov 20095.4 - Mar 20125.5 - Jun 20135.6 - Aug 20147.0.0 - Dec 20157.1-dev Mar 2016HHVM-3.12.1

secNext Step!

Page 57: Дмитрий Стогов

Confidential - © All rights reserved. Zend Technologies, Inc.57

Вопросы?

Dmitry Stogov

Principal Engineer at Zend Technologies

@dstogov

[email protected]

www.zend.com