O assunto de hoje é Generator. Neste artigo, vou explicar o que estudei e o link para o repositório com todo o conteúdo.
Generators
Então, vendo que o 'for' não ia ser a melhor solução sempre, os criadores do PHP decidiram implementar os Generators na versão 5.5 da linguagem. Generators são basicamente funções que retornam o resultado de algo iterável sem precisar salvar o resultado da iteração em uma variável. Uma vez que o generator logo após retornar iterar já retorna o resultado, ou seja, não sendo mais necessário fazer o famoso $array[] = $value
, economizando então memória e evitando um erro de estouro de pilha de execução.
1 - Uso básico
function yieldCall()
{
for ($i = 0; $i < 10; $i++) {
yield $i;
}
}
$generator = yieldCall();
var_dump($generator);
foreach ($generator as $value) {
echo $value;
}
Rodando o código, tu consegue perceber que o valor é impresso na tela normalmente, assim como se fosse feito da forma tradicional.
2 - Definindo chave para o iterador
$csv = 'nome;raziel';
function parserYield($input)
{
foreach (explode(';', $input) as $key => $value) {
yield uniqid() => $value;
}
}
foreach (parserYield($csv) as $key => $value) {
echo ($key);
echo '<hr>';
echo $value;
}
echo '<hr>';
3 - Usando com ponteiros
function &genYield()
{
$value = 3;
while ($value > 0) {
yield $value;
}
}
foreach (genYield() as &$key) {
echo (--$key);
}
echo '<hr>';
4 - Composição de um array
class Test
{
}
function y()
{
yield 3;
yield 4;
}
function x()
{
yield 1;
yield from y();
}
$x = x();
foreach ($x as $value) {
var_dump($value);
}
$x->getReturn();
var_dump(is_array($x->getReturn()));
echo '<hr>';
O Motivo Final
echo '<h1> Exemplo benchmark: </h1> <hr>';
function forEachOnly()
{
$numeros = [];
foreach (range(1, 1000000) as $value) {
$numeros[] = $value;
}
echo "Memory peak usage FOREACH: " . memory_get_peak_usage(true) . " bytes \n";
}
function generatorCall()
{
foreach (range(1, 1000000) as $value) {
yield $value;
}
}
function generatorOnly()
{
foreach (generatorCall() as $value) {
$value;
}
echo "Memory peak usage GENERATOR: " . memory_get_peak_usage(true) . " bytes \n";
}
# forEachOnly(); DESCOMENTA PRA VER ESSE
# generatorOnly(); E DEPOIS DESCOMENTA ESSE
Irei mostrar aqui o benchmark que você mesmo pode testar:
Memory peak usage FOREACH: 44052480 bytes
Memory peak usage GENERATOR: 18878464 bytes
Top comments (0)