> Мой вердикт - там фигня, а не тесты. Хотите поспорить, давайте приводите
> свои аргументы, а я приведу свои.Спорить с пыхапистоми о производительности? Зачем? Это все равно что обсуждать музыкальное произведение с теми, кто слышал его только в «напеве Рабиновича».
Динамика в ЯП сама по себе вещь, производительности никак не способствующая, а уж совместно со слабой типизацией – вообще убойное для анализатора и оптимизатора сочетание.
Из-за этого, примитивных типов там, как таковых нет.
Есть универсальные конструкты-обертки, способные вместить любой нужный тип плюс информацию о текущем. В похапе это zval:
https://github.com/php/php-src/blob/master/Zend/zend_types.h...
typedef struct _zval_struct zval;typedef union _zend_value {
zend_long lval; /* long value */
double dval; /* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
struct _zval_struct {
zend_value value; /* value */
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar reserved) /* call info for EX(This) */
} v;
uint32_t type_info;
} u1;
union {
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
uint32_t access_flags; /* class constant access flags */
uint32_t property_guard; /* single property guard */
uint32_t extra; /* not further specified */
} u2;
};
Поэтому, на самом деле, даже просто «добраться до начинки», т.е. самих данных переменной, относительно недешево, потому как сначала нужно прочитать и определить тип.
А уж про операции я и объяснять не буду. Пускай пыхпышники и далее считают, что
add REG1, REG2
и
PUSH zval1
PUSH zval2
MOV REG1, [zval1+type_info*magic_val]
CALL [add_op_offset + REG1]
...
здесь еще следует определение типа для второй переменной и ее приведение в случае необходимости.
почти одинаковы по затратам. Ведь они точно знают, что мифические бранчпредикторы давно вышли на уровень ораклов, все кэши отменили за ненадобностью и поэтому ПоХаПе и производительность можно вполне упоминать в одном предложении )