Как substr_count (), array_count_values ​​() & count () работает внутри PHP?Как это решает проблему производительности и скорости в случае больших данных? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь понять, как эти функции работают внутри и как они справляются с производительностью и скоростью в случае больших данных.Я знаю, что они написаны на C, но я хочу понять это и знать, что я могу сделать, когда их спрашивают и сталкиваются с такими ситуациями в php.Я также видел его код на C на github, например substr_count , но кто-нибудь может объяснить мне.

1 Ответ

0 голосов
/ 04 июня 2018

Эти реализации действительно просты.

count

// count($a)
it works like `return a.length` in other languages.

array_count_values ​​

// array_count_values(a)
// https://github.com/php/php-src/blob/683123fa39114692b712b8c88d5b2fec9b1fc7ea/ext/standard/array.c
// it works like this:
$r = [];
for($a as $v) {
    $r[$v]++;
}
return $r;

substr_count

// substr_count(p, needle)
if (needle_len == 1) {
    //if there is only one char in needle, just search it in the memory, more effective
    cmp = needle[0];
    while ((p = memchr(p, cmp, endp - p))) {
        count++;
        p++;
    }
} else {
    // just like C's strstr to search
    while ((p = (char*)php_memnstr(p, needle, needle_len, endp))) {
        p += needle_len;
        count++;
    }
}

//or PHP-like version 
//remember: the strchr is strstr in PHP while they are different in C
//so just a demo here
$c = 0;
while($p = strstr($p, $needle)) {
    // get the remaining string
    // in C here is a pointer operation and much more faster
    $p = substr($p, strlen($needle)); 
    $c++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...