Php strtolower(trim())==strtolower(trim())速度慢

Php strtolower(trim())==strtolower(trim())速度慢,php,regex,Php,Regex,我正在看一些在CSV中处理大约7k个项目的代码。CSV导入器检查重复项,该过程的一部分是对每一行检查已处理的所有其他行的重复项。这意味着它做了一些类似于 foreach ($users as $possibleDuplicate) { if (strtolower(trim($user->first_name)) == strtolower(trim($possibleDuplicate->first_name)) && strtolower(trim($us

我正在看一些在CSV中处理大约7k个项目的代码。CSV导入器检查重复项,该过程的一部分是对每一行检查已处理的所有其他行的重复项。这意味着它做了一些类似于

foreach ($users as $possibleDuplicate) {
    if (strtolower(trim($user->first_name)) == strtolower(trim($possibleDuplicate->first_name)) && strtolower(trim($user->last_name)) == strtolower(trim($possibleDuplicate->last_name))) {

    }
}
忽略这个脚本中的糟糕的执行想法(我没有写它)。strtolower(trim())似乎对我的导入造成了相当大的性能影响。我一直在寻找一个更高效、更快的替代品。我还没有做任何性能测试,但计划明天再做。我希望这里的人能够提供一些关于方法的信息,比如
preg\u match()


更新:我不想提高此循环的性能,我认识到在foreach之外移动方法将显著提高性能。

您应该在循环之外移动没有变化的部分:

也许把姓氏测试放在名字测试之前(如果每个人的名字都是“John”,那么失败的速度会更快,但是每个人的姓氏都可以是“McGuire”)


您应该将变化不大的零件移动到回路外:

也许把姓氏测试放在名字测试之前(如果每个人的名字都是“John”,那么失败的速度会更快,但是每个人的姓氏都可以是“McGuire”)


您应该将变化不大的零件移动到回路外:

也许把姓氏测试放在名字测试之前(如果每个人的名字都是“John”,那么失败的速度会更快,但是每个人的姓氏都可以是“McGuire”)


您应该将变化不大的零件移动到回路外:

也许把姓氏测试放在名字测试之前(如果每个人的名字都是“John”,那么失败的速度会更快,但是每个人的姓氏都可以是“McGuire”)


我可以告诉你,regex肯定会比strtolower慢(不区分大小写的字符串比较)?你是否通过这些函数多次运行它们?如果是这样,您可以处理它们并将它们存储在一个映射中,然后从那里检索,或者在发现映射中不存在的值时懒洋洋地进行检索。@alex是的,它们都在整个导入程序中。。。这可能是根本原因。我发现这篇文章:可能有帮助,
stracecmp
是一个替代方案。另外,您应该尝试使用
=
操作符,因为两者都是字符串,比较可能更快。我可以告诉您,regex肯定会比
strtolower
慢,可能使用(不区分大小写的字符串比较)?您是否通过这些函数多次运行它们?如果是这样,您可以处理它们并将它们存储在一个映射中,然后从那里检索,或者在发现映射中不存在的值时懒洋洋地进行检索。@alex是的,它们都在整个导入程序中。。。这可能是根本原因。我发现这篇文章:可能有帮助,
stracecmp
是一个替代方案。另外,您应该尝试使用
=
操作符,因为两者都是字符串,比较可能更快。我可以告诉您,regex肯定会比
strtolower
慢,可能使用(不区分大小写的字符串比较)?您是否通过这些函数多次运行它们?如果是这样,您可以处理它们并将它们存储在一个映射中,然后从那里检索,或者在发现映射中不存在的值时懒洋洋地进行检索。@alex是的,它们都在整个导入程序中。。。这可能是根本原因。我发现这篇文章:可能有帮助,
stracecmp
是一个替代方案。另外,您应该尝试使用
=
操作符,因为两者都是字符串,比较可能更快。我可以告诉您,regex肯定会比
strtolower
慢,可能使用(不区分大小写的字符串比较)?您是否通过这些函数多次运行它们?如果是这样,您可以处理它们并将它们存储在一个映射中,然后从那里检索,或者在发现映射中不存在的值时懒洋洋地进行检索。@alex是的,它们都在整个导入程序中。。。这可能是根本原因。我发现这篇文章:可能有帮助,
stracecmp
是一个替代方案。另外,您应该尝试使用
==
操作符,因为两者都是字符串,比较起来可能更快。
$userFirstNameLower = strtolower(trim($user->first_name));
$userLastNameLower = strtolower(trim($user->last_name));
foreach ($users as $possibleDuplicate) {
    if ( $userLastNameLower == strtolower(trim($possibleDuplicate->last_name)) && $userFirstNameLower == strtolower(trim($possibleDuplicate->first_name))) {

    }
}