Open woodongwong opened 2 years ago
@BadJacky Thanks,我之所以认为 Generator 无法节省内存是从内存的角度出发,在 Generator 的 RFC中,Nikita 写了一个 getLinesFromFile 函数示例,分享了使用 yield 关键字节省了很多代码,并且提升了性能
function getLinesFromFile($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}
while (false !== $line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);
}
$lines = getLinesFromFile($fileName);
foreach ($lines as $line) {
// do something with $line
}
其实例子中的节省内存的核心是fgets+while
,当然 Generator 可以使程序更简洁高效。
记录自己遇到的面试题,答案是根据自己的经验写的,不保证正确。
PHP 的哪些语言特征在合适的场景中可以显著减少程序的内存开销?
解析
首先排除A和D,D指的是类型声明。
Generator在减少内存方面是有争议的,从本质上将,Generator无法减少内存开销,Generator只是通过
yield
改变了代码执行顺序,目前Generator使用比较广泛的应用就是协程调度,比如amp框架。关于协程调度可以阅读这篇文章:https://www.laruence.com/2015/05/28/3038.html既然是节省内存开销,肯定是和数据结构有关系,在SPL中有一个SplFixedArray类,当数组比较大时,可以有效的减少内存的占用,具体效果可以看一下php-arrays-in-memory-comparison,SplFixedArray有很多限制,在使用方便程度上,不如Array,具体限制可以查看官方文档。