Jump to content
php.lv forumi

RENARTI PHP MVC Framework


renarti

Recommended Posts

  • Replies 38
  • Created
  • Last Reply

Top Posters In This Topic

regexp nav vienkaarshi leeni tie ir Uber leeni, praatiigi cilveeki tos izmanto tikai tur kur citu alternatiivu nav. Protams ja izstraadaataajs razho app kuraa darbosies tikai vinja vecmaaminja tad taada pieeja ir pat vairaak kaa OK. Bet ja tas ir nopietns freimworks vai apps tipa facebook tad tas ir nepiedodami.

Link to comment
Share on other sites

regexp bremzi baazt korē ir augstākā mērā stulbi, tas pats attiecas uz explodi(protams daudz mazākā mērā nekā regexp). Ja nav elegantaaku risinājumu, tad labāk ir tā kā jau ir uztaisīts.

WTF? Tu vispār sajēdz, ko tu runā?

1 sekundē izgāja:

- 1`000`000 reizes - $a=explode('/','asdafd/asdfasdf/asdfasdf/asdfasdf');

- 1`000`000 reizes - 20 pēc kārtas sarakstīti $a=$a+1;

- 10`000`000 reizes - tukš for cikls;

 

explode ir aptuveni 20x lēnāks kā $a=$a+1;

Link to comment
Share on other sites

"Koda dievs",

 

jociigais cilveek Tu man centiisies ieskaidrot ka mashiinkoda operaacija - integer inkrements ir tikai 20 reizes aatraaks par rindas skaneeshanas un sastaavdalju paarsuutiishanas operaacijaam , dzekinj nokompilee uz c un paskaties kodu, varbuut tad tev naaks sapraats maajaas.

 

Jociigi laiki pienaakushi programmet saakushi visaadi rahiiti, kas c un vai asm nav redzeejushi un priekshstata par to kaa viss laaciitim veederaa notiek nav nekaada.

 

explode ir tuukstoshiem reizhu leenaaka nekaa $a=$a+1

 

taatad luuk, explode php funkcijas kods:

 

 

PHP_FUNCTION(explode)

{

zval **str, **delim, **zlimit = NULL;

int limit = -1;

int argc = ZEND_NUM_ARGS();

 

if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &delim, &str, &zlimit) == FAILURE) {

WRONG_PARAM_COUNT;

}

convert_to_string_ex(str);

convert_to_string_ex(delim);

 

if (argc > 2) {

convert_to_long_ex(zlimit);

limit = Z_LVAL_PP(zlimit);

}

 

if (! Z_STRLEN_PP(delim)) {

php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");

RETURN_FALSE;

}

 

array_init(return_value);

 

if (! Z_STRLEN_PP(str)) {

if (limit >= 0 || argc == 2) {

add_next_index_stringl(return_value, "", sizeof("") - 1, 1);

}

return;

}

 

 

if (limit == 0 || limit == 1) {

add_index_stringl(return_value, 0, Z_STRVAL_PP(str), Z_STRLEN_PP(str), 1);

} else if (limit < 0 && argc == 3) {

php_explode_negative_limit(*delim, *str, return_value, limit);

} else {

php_explode(*delim, *str, return_value, limit);

}

}

 

 

 

 

 

PHPAPI void php_explode(zval *delim, zval *str, zval *return_value, int limit)

{

char *p1, *p2, *endp;

 

endp = Z_STRVAL_P(str) + Z_STRLEN_P(str);

 

p1 = Z_STRVAL_P(str);

p2 = php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);

 

if (p2 == NULL) {

add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1);

} else {

do {

add_next_index_stringl(return_value, p1, p2 - p1, 1);

p1 = p2 + Z_STRLEN_P(delim);

} while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL &&

(limit == -1 || --limit > 1));

 

if (p1 <= endp)

add_next_index_stringl(return_value, p1, endp-p1, 1);

}

}

 

 

 

 

 

 

 

PHPAPI void php_explode_negative_limit(zval *delim, zval *str, zval *return_value, int limit)

{

#define EXPLODE_ALLOC_STEP 50

char *p1, *p2, *endp;

int allocated = EXPLODE_ALLOC_STEP, found = 0, i = 0, to_return = 0;

char **positions = safe_emalloc(allocated, sizeof(char *), 0);

 

endp = Z_STRVAL_P(str) + Z_STRLEN_P(str);

 

p1 = Z_STRVAL_P(str);

p2 = php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);

 

if (p2 == NULL) {

/*

do nothing since limit <= -1, thus if only one chunk - 1 + (limit) <= 0

by doing nothing we return empty array

*/

} else {

positions[found++] = p1;

do {

if (found >= allocated) {

allocated = found + EXPLODE_ALLOC_STEP;/* make sure we have enough memory */

positions = erealloc(positions, allocated*sizeof(char *));

}

positions[found++] = p1 = p2 + Z_STRLEN_P(delim);

} while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL);

 

to_return = limit + found;

/* limit is at least -1 therefore no need of bounds checking : i will be always less than found */

for (i = 0;i < to_return;i++) { /* this checks also for to_return > 0 */

add_next_index_stringl(return_value, positions,

(positions[i+1] - Z_STRLEN_P(delim)) - positions,

1

);

}

}

efree(positions);

#undef EXPLODE_ALLOC_STEP

}

 

 

 

Un tagad saliidzini visu sho blaakji ar vienu inkrementa operaaciju: a++;

Link to comment
Share on other sites

Uztaisi benčmarku un tad posto PHP sourci, es C/C++ un ASM programmēju, kad tu vēl biksiņās čurāji. Varētu padomāt, ka $a++ PHP ir tas pats, kas a++ C. Nu nav tā. Esi padomājis kād memory menidžements stāv aiz PHP mainīgajiem? Tieši šī iemesla dēļ iekš PHP explode ir tikai 20 reizes lēnāks par $a++.

Ja $a++ izgāja 1M reizes sekundē, tad a++ iekš C iet ap 100M reizes sekundē. Bet mēs taču šeit runājam par PHP, vai ne?

Link to comment
Share on other sites

Es laikam esmu brutāls lamers. :) līdz šim eksplodēju request_uri pa segmentiem ar "/" kur [1] - kontrolieris (pēc tam $router[$uri[1]] = $real_controller name routings) [2] - action [3]....- argumenti :)

Ja nav 2, metu main, ja nav [1], metu index, ja [1] nav routēs, metu 404. :)

Link to comment
Share on other sites

codez, jaa php int tipa mainiigajam $a , $a++ ir tas pats kas ieksh c , a++

 

benchmarku uztaisiishu protams (un taas nebuus tikai 1M iteraacijas), diemzheel pagaidaam nav laika ar taadiem siikumiem kraameeties, jo ljoti daudz darba.

 

Par biksinjaas churaashanu, protams nolaidi greizi. Domaaju, ka pats veel maates pienu suuci , kad es nesu perfokartes ar ASM kodu uz auseklja ielu, piebilde - IBM PC tad veel nebija, visu dariijaam uz mainfreimiem, diskeshu arii nebija, ievaddati tikai caur perfokarteem, hehe, tas tik bija laiks...

 

 

Ever wonder how PHP can have so many different data types for its variables? PHP is regarded as a loosely typed language, and variables can change their data type easily. In fact, PHP can have eight different types:

  • integer numbers (stored as longs in c)
  • floating point numbers (stored as doubles in c)
  • strings (stored as a char array in c)
  • Booleans (stored as 0 or 1 as longs in c)
  • Arrays (stored as HashTable struct in c)
  • Objects (stored as zend_object_value in c)
  • Resources (stored as zend_object_value in c) [references functions or external PHP resources]
  • Null (nothing is stored, only type is set to null type)

Link to comment
Share on other sites

codez, jaa php int tipa mainiigajam $a , $a++ ir tas pats kas ieksh c , a++

Palasi, kas ir byte kods.

Iekš C a++, atkarībā no citiem apstākļiem, būs 1-3 procesora instrukcijas. (Instrukciju optimizācija, ja notiek cikliskas darbības un mainīgo var paturēt procesora reģistrā)

Iekš PHP:

1)fonā darbosies byte koda izpildes VM, kura ies uz priekšu pa bytecodu

2)pārbaudīs mainīgā tipu, lai zinātu, ko ar to darīt un VM ies uz noteikto vietu izpildei.

3)nolasīs datus no atmiņas, apstrādās un iebāzīs atpakaļ (nekāda procesora instrukciju līmeņa optimizācija te nebūs).

 

Tieši tāpēc $a++ iekš PHP ir x100 lēnāks kā a++ iekš C;

 

P.S.

Atšķirīgi ir piemēram JAVA un nodejs, kurām ir JIT kompilātori, kas tiešām kompilē mašīnkodu. V8 js dzinējam, ko izmanto nodejs pat JIT kompilātors ir tik advancēts, ka mainīgie ir reālas atmiņas adreses un var tikt kods optimizēts instrukciju līmenī tā, ka tiešām C a++ ir tuvu tas pats, kas js a++.

Edited by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...