рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, PHP рдореЗрдВ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рди рдХреЗрд╡рд▓ рдореВрд▓реНрдпрд╡рд╛рди рдбреЗрдЯрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреВрд░реЗ рдЬрд╝рд╡рд▓ рдХрдВрдЯреЗрдирд░ рд╣реИред рдФрд░ рдРрд╕реЗ рдЪрд░ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрддреА рд╣реИред
PHP рдореЗрдВ
рдЬреБрдбреА рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ - рддреЗрдЬ, рд╕рд╛рд╣рдЪрд░реНрдп, рдФрд░ рдкрд░рд┐рдорд╛рдг рдХрдо рд╕реНрдореГрддрд┐ рдХреЗ рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди / рдбреАрд╕рд░реАрдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВред
рдореБрдЭреЗ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рдереА, рдЕрд░реНрдерд╛рддреНред рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рддрд░рд╣, рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдХреНрд░рдордмрджреНрдзрддрд╛ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд░рд▓ рд╣реИ:
рдРрд░реЗ (200 => 0, 300 => -5000, -100 => 2000) рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
"C8 + 0 + 12c-1388-64 + 7d0"
рджреЛ рдЬрдЧрд╣ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рд╕реНрд░реЛрдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рджреВрд╕рд░рд╛ рдЪреБрдирд╛ рдЧрдпрд╛ред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди php_judy.c рдореЗрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ
рдмреЛрд▓реНрдб рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВред
- рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
/* implements some interface to provide access to judy object as an array */
zend_class_implements(judy_ce TSRMLS_CC, 1, zend_ce_arrayaccess, zend_ce_iterator);
zend_class_implements(judy_ce TSRMLS_CC, 1, zend_ce_serializable);
judy_ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
- рдШреЛрд╖рдгрд╛ рдХреЗ рддрд░реАрдХреЗ:
PHP_METHOD(judy, memoryUsage);
PHP_METHOD(judy, serialize);
PHP_METHOD(judy, unserialize);
PHP_METHOD(judy, count);
- рдЕрдирдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░:
ZEND_BEGIN_ARG_INFO_EX(arginfo_judy_unserialize, 0, 0, 1) ZEND_ARG_INFO(0,str) ZEND_END_ARG_INFO()
- рджреГрд╢реНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди:
PHP_ME(judy, memoryUsage, NULL, ZEND_ACC_PUBLIC)
PHP_ME(judy, serialize, NULL, ZEND_ACC_PUBLIC)
PHP_ME(judy, unserialize, arginfo_judy_unserialize, ZEND_ACC_PUBLIC)
PHP_ME(judy, count, arginfo_judy_count, ZEND_ACC_PUBLIC)
- рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрд╡рдпрдВ рдФрд░ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп:
PHP_METHOD(judy, serialize) { JUDY_METHOD_GET_OBJECT if ( intern->type == TYPE_INT_TO_INT ) { long int index = 0, i = 0, l; long int * PValue; char * s; Word_t idx1 = 0, idx2 = -1, Rc_word; JLC(Rc_word, intern->array, idx1, idx2); l = 64 + ( Rc_word << 3 ); s = emalloc ( l ); if ( s == NULL ) RETURN_NULL(); JLF ( PValue, intern->array, index ); while ( PValue != NULL && PValue != PJERR ) { JLG ( PValue, intern->array, index ); if ( index < 0 ) { if ( *PValue < 0 ) sprintf ( s+i, "-%x-%x", -index, -*PValue ); else sprintf ( s+i, "-%x+%x", -index, *PValue ); } else { if ( *PValue < 0 ) sprintf ( s+i, "+%x-%x", index, -*PValue ); else sprintf ( s+i, "+%x+%x", index, *PValue ); } i += strlen ( s+i ); if ( i > l - 50 ) { l <<= 1; s = erealloc ( s, l ); if ( s == NULL ) RETURN_NULL(); } JLN ( PValue, intern->array, index ); } *(s+i) = 0; RETURN_STRING ( s, 0 ); } RETURN_NULL(); } long int Hex2Int ( char * s, long int * j, long int l ) { long int v = 0; char sym; if ( s[*j] == '+' ) { (*j)++; sym = s[*j]; while ( sym != '+' && sym != '-' && *j < l ) { v <<= 4; if (( sym >= '0' ) && ( sym <= '9' )) v += ( sym - '0' ); else v += ( sym - 'a' + 10 ); (*j)++; sym = s[*j]; } } else { (*j)++; sym = s[*j]; while ( sym != '+' && sym != '-' && *j < l ) { v <<= 4; if (( sym >= '0' ) && ( sym <= '9' )) v -= ( sym - '0' ); else v -= ( sym - 'a' + 10 ); (*j)++; sym = s[*j]; } } return v; } PHP_METHOD(judy, unserialize) { JUDY_METHOD_GET_OBJECT intern->counter = 0; intern->type = TYPE_INT_TO_INT; intern->array = (Pvoid_t) NULL; char * s; long int l, j = 0; Word_t * PValue, index, value; if ( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s, &l) == FAILURE) return; if ( l < 4 ) return; while ( j < l ) { index = Hex2Int ( s, &j, l ); value = Hex2Int ( s, &j, l ); JLI ( PValue, intern->array, index ); if ( PValue == NULL || PValue == PJERR ) return; *PValue = value; } return; }
- рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:
phpize ./configure make make install
- Php.ini рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ
extension=judy.so
рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг \ рдорд╛рдирдХ
<?php function InitArray ( &$ar, $init_srand, $max ) { srand ( $init_srand ); for ( $i = -$max; $i < $max; $i++ ) { $index = rand ( -$max, $max ); $value = rand ( -1000, 1000 ); $ar[$index] = $value; } } function ShowTime ( $st, $text ) { printf ( "$text in %.2f sec.\n", microtime ( true ) - $st ); } $init_srand = time (); $max = 500000; echo "srand = $init_srand, max = $max\n"; $init_mem = memory_get_usage(); $st = microtime ( true ); $a = array (); InitArray ( $a, $init_srand, $max ); ShowTime ( $st, "Initialized std. array" ); echo "Elements in std. array: " , count ( $a ) , "\n"; echo "Used memory: " , (memory_get_usage()-$init_mem) , " bytes\n\n"; $st = microtime ( true ); $j = new Judy(Judy::INT_TO_INT); InitArray ( $j, $init_srand, $max ); ShowTime ( $st, "Initialized Judy array" ); echo "Elements in Judy array: " , count ( $j ) , "\n"; echo "Used memory: " , $j->memoryUsage() , " bytes\n\n"; $st = microtime ( true ); $a_ser = serialize ( $a ); ShowTime ( $st, "Serialized std. array" ); $st = microtime ( true ); $j_ser = serialize ( $j ); ShowTime ( $st, "Serialized Judy array" ); echo "Serialized std. length: " , strlen ( $a_ser ) , "\n"; echo "Serialized Judy length: " , strlen ( $j_ser ) , "\n\n"; $st = microtime ( true ); $a_unser = unserialize ( $a_ser ); ShowTime ( $st, "Unserialized std. array" ); $st = microtime ( true ); $j_unser = unserialize ( $j_ser ); ShowTime ( $st, "Unserialized Judy array" ); if (count ( $j_unser ) != count ( $a )) die ( "ERROR: arrays size mismatch\n" ); foreach ( $a as $index => $value ) { if ( $j_unser[$index] != $value ) { die ( "ERROR: arrays data mismatch\n" ); } } echo "OK: std. array and unserialized Judy array are identical\n"; ?>
рд╣рдореЗрдВ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ
srand = 1348822174, max = 500000 Initialized std. array in 0.76 sec. Elements in std. array: 632067 Used memory: 49703784 bytes Initialized Judy array in 0.98 sec. Elements in Judy array: 632067 Used memory: 3247108 bytes Serialized std. array in 0.33 sec. Serialized Judy array in 0.18 sec. Serialized std. length: 9904186 Serialized Judy length: 6061744 Unserialized std. array in 0.13 sec. Unserialized Judy array in 0.08 sec. OK: std. array and unserialized Judy array are identical
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬреЛрдбрд╝реА
- рдмреЗрд╢рдХ, рдЖрдк рдХреНрд░рдордмрджреНрдз рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
- рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреВрдбреА рдХреЗ рд▓рд┐рдП рдлреЛрд░рдЪреЗрдЯ рдЗрдЯрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ:
рдпрджрд┐ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 0 рдФрд░ -1 рд╕реВрдЪрдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдлрд╝реЙрд░рдЗрдЪ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ
<?php $j = new Judy(Judy::INT_TO_INT); $j[0] = 456; $j[-1] = 123; foreach ( $j as $index => $value ) { echo "$index $value\n"; } ?>
рдХреНрд╡реЗрд░реА "foreach [0] [-1]" рдмрдирд╛рдИ рдЧрдИ рдереА ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
PS рдпрд╣ рдкреЛрд╕реНрдЯ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рднреА рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ - рд╕рд┐рддрдВрдмрд░ 2012 рдореЗрдВ, рдФрд░ рдпрд╣ рд╕рд╛рд░рд╛ рд╕рдордп рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдкрдбрд╝рд╛ рд░рд╣рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЕрдм рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ 3 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрд▓рдЧ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬреАрдердм рдкрд░ рдХреНрд░рдордмрджреНрдзрддрд╛ рд▓рд╛рдЧреВ рдХреАред
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдЧреЗ рдмрдврд╝рд╛ рдФрд░ рдмрд╣реБрдд рд╣рдж рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рдХреБрдВрдЬреА рд╕рдорд░реНрдерди рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛
ред
github.com/orieg/php-judy/issues/13github.com/tony2001/php-judy/tree/serialize