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