假设我们有一个非常大的字符串$str,我们需要将一小部分字符串(假设整个字符串,但没有前3个字节)传递给函数.这样做的方式substr:
consumer_function(substr($str, 3));
Run Code Online (Sandbox Code Playgroud)
似乎效率不高,因为substr在返回结果之前,似乎会将字符从初始字符串复制到新字符串中.有没有办法我们可以将该字符串的大部分传递给函数而无需过多的复制?我们无法更改该功能的代码.
在您的工作上工作$str,而无需创建另一个变量,您可以这样做:
for($i=1;$i<=$no;$i++) $str[strlen($str)-$i]=null;
$str=rtrim($str);
Run Code Online (Sandbox Code Playgroud)
删除$no末尾的最后一个字符
并且:
for($i=0;$i<$no;$i++) $str[$i]=null;
$str=ltrim($str);
Run Code Online (Sandbox Code Playgroud)
删除其中的第一个字符。
测试 A:从字符串开头删除 30 个字符
测试用例 1: substr($str,30)
52784749 bytes of data
0.72129082679749s execution time
52903844 bytes of ram used
Run Code Online (Sandbox Code Playgroud)
测试用例 2:使用置空字符串字符和 ltrim 进行循环
52784749 bytes of data
0.23676204681396s execution time
52904276 bytes of ram used
Run Code Online (Sandbox Code Playgroud)
测试 B:从字符串末尾删除 30 个字符
测试用例 1: substr($str,0,-30)
52784749 bytes of data
0.83467292785645s execution time
52903924 bytes of ram used
Run Code Online (Sandbox Code Playgroud)
测试用例 2:使用置空字符串字符和 rtrim 进行循环
52784749 bytes of data
0.27498316764832s execution time
52904340 bytes of ram used
Run Code Online (Sandbox Code Playgroud)
总而言之,当您确实需要这种微优化时,这是一个合理的问题,使用此解决方案实现了3 倍的处理时间,并且使用 1.2Mb 的较小数据集实现了更好的处理时间(高达 40 倍)。
需要更多的测试,但看起来是一个可行的选择。
正如 Grigory 指出的那样,内存比速度更重要,Fergus 注意到 ltrim() 的内存占用:
不幸的是,使用 trim() 会让我们回到原点,在某些时候使用的内存加倍,而速度却只有一倍。增加。
另一方面,如果不使用trim(),我们最终会得到一个长度相同且包含空字符的字符串,但速度会提高,内存也会节省。
也适用于null、false和“ \x08 ”(BackSpace chr)。
var_dump() 报告的字符串与原始字符串的长度相同,但引号中的值是您所期望的:只有您感兴趣的部分。
太糟糕了,问题被[关闭]:(