在哪里可以找到用于编写每个PHP的算法;内置的;功能?

在哪里可以找到用于编写每个PHP的算法;内置的;功能?,php,built-in,Php,Built In,我最近构建了一个基于PHP的应用程序,通常需要几(>10)秒来解析目标字符串(>10秒,因为通常100kB+的字符串上有数千次检查)。我正在寻找减少执行时间的方法 我开始想知道PHP的每个“内置”函数是如何编写的。例如,如果您转到手册(链接)中的strpos()参考,其中有很多信息,但没有算法 谁知道呢,也许我可以为我的特定应用程序编写一个比内置函数更快的函数?但我无法知道例如strpos()的算法。算法是否使用如下方法: function strposHypothetical($haystac

我最近构建了一个基于PHP的应用程序,通常需要几(>10)秒来解析目标字符串(>10秒,因为通常100kB+的字符串上有数千次检查)。我正在寻找减少执行时间的方法

我开始想知道PHP的每个“内置”函数是如何编写的。例如,如果您转到手册(链接)中的
strpos()
参考,其中有很多信息,但没有算法

谁知道呢,也许我可以为我的特定应用程序编写一个比内置函数更快的函数?但我无法知道例如strpos()的算法。算法是否使用如下方法:

function strposHypothetical($haystack, $needle) {

    $haystackLength = strlen($haystack);
    $needleLength   = strlen($needle);//for this question let's assume > 0

    $pos = false;

    for($i = 0; $i < $haystackLength; $i++) {
        for($j = 0; $j < $needleLength; $j++) {
            $thisSum = $i + $j;
            if (($thisSum > $haystackLength) || ($needle[$j] !== $haystack[$thisSum])) break;          
        }
        if ($j === $needleLength) {
            $pos = $i;
            break;
        }
    }
    return $pos;
}
函数strposHypothetical($haystack,$needle){
$haystackLength=strlen($haystack);
$needlegth=strlen($needle);//对于这个问题,我们假设>0
$pos=假;
对于($i=0;$i<$haystackLength;$i++){
对于($j=0;$j<$needleLength;$j++){
$thisSum=$i+$j;
如果($thisSum>$haystackLength)| |($pinder[$j]!==$haystack[$thisSum])断裂;
}
如果($j==$needlegth){
$pos=$i;
打破
}
}
返回$pos;
}
或者它会使用一种慢得多的方法,比如针的出现次数组合substr_count(),如果出现次数>0,则使用for循环或其他方法


我已经分析了应用程序中的函数和方法,并在这方面取得了重大进展。另外,请注意,这篇文章并没有多大帮助。在哪里可以找到PHP中每个内置函数使用的算法,或者这些信息是专有的?

可以在中找到内置PHP函数

strpos
的情况下,您可以在中找到PHP实现。在其核心,此函数实际使用,它实际上是以下函数的别名:

如果我们阅读源代码,我们可以找到用于实现strpos的算法本身:

while (p <= end) {
    if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
        if (!memcmp(needle, p, needle_len-1)) {
            return p;
        }
    }

    if (p == NULL) {
        return NULL;
    }
    p++;
}

这是在字符串中查找子字符串索引的一个相当有效的算法。它与
strposHypothetical
的算法几乎相同,并且在复杂度方面应该同样有效,除非
memcpy
在看到字符串相差一个字符时不会提前返回,当然,它是用C实现的,它将更加精简和快速。

内置的PHP函数可以在中找到

strpos
的情况下,您可以在中找到PHP实现。在其核心,此函数实际使用,它实际上是以下函数的别名:

如果我们阅读源代码,我们可以找到用于实现strpos的算法本身:

while (p <= end) {
    if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
        if (!memcmp(needle, p, needle_len-1)) {
            return p;
        }
    }

    if (p == NULL) {
        return NULL;
    }
    p++;
}

这是在字符串中查找子字符串索引的一个相当有效的算法。它与
strposHypothetical
的算法几乎相同,在复杂度方面也应该同样有效,除非
memcpy
在看到字符串相差一个字符时不会提前返回,当然,在C语言中实现,它会更精简、更快。

以源代码为例,通过在
/ext/standard/string.c
中搜索
PHP_函数(strpos)
可以找到
strpos()。您可以检查其核心的几乎所有内容。@TheonendonlyChemistryblob改进PHP内置的唯一方法是改进它,这意味着更改PHP代码库中当前的实现代码。您不能希望通过使用php语句的组合来改进内置代码(因为您只知道php)。例如,查看源代码,您可以通过在
/ext/standard/string.c
中搜索
php_函数(strpos)
找到
strpos()
。您可以检查其核心的几乎所有内容。@TheonendonlyChemistryblob改进PHP内置的唯一方法是改进它,这意味着更改PHP代码库中当前的实现代码。您不能希望通过使用php语句的组合来改进内置代码(因为您只知道php)。
while (p <= end) {
    find the next occurrence of the first character of needle;
    if (occurrence is found) {
        set `p` to point to this new location in the string;
        if ((character at `p` + `length of needle`) == last character of needle) {
            if ((next `length of needle` characters after `p`) == needle) {
                return p; // Found position `p` of needle in haystack!
            }
        }
    } else {
        return NULL; // Needle does not exist in haystack.
    }
    p++;
}