Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia a todos.
Eu estou aprendendo PHP e para aplicar os meus conhecimentos eu resolvi reproduzir em PHP um código que eu desenvolvi em C/C++.
A função do programa é similar ao cruzamento das ervilhas que todos nós aprendemos em biologia, você cruza X ervilhas verdes com Y ervilhas amarelas e o resultado são algumas ervilhas filhas verdes, outras amarelas, e outras meio termo (não vou entrar em detalhes).
O meu programa gera duas populações (representadas por dois arrays A e B - exemplificadas no código abaixo) de tamanho máximo de 500k unidades, e cada unidade tem as suas características.
O programa pega cada elemento do array A e cruza com um elemento aleatório do array B.
Logo após, o programa pega cada elemento do array B e cruza com um elemento aleatório do array A.
Posteriormente eu analiso os dois resultados obtidos, conseguindo assim o meu resultado final.
O problema ocorre justamente durante o cruzamento entre os arrays A e B.
Este cálculo demora cerca de 1 segundo para ser concluído no meu programa. Mas quando eu o escrevi em PHP, apesar do resultado final estar correto, ele levou cerca de meia hora !
Eu não entendi o porque desta demora. Estou usando o programa WampServer para simular um servidor.
Vou postar apenas as partes "relevantes" do código, estou deixando todas as estruturas (if-else, foreach etc) e todas as funções do PHP que eu utilizo (count, floor, mt_rand etc). As demais linhas (que não estão no código abaixo) fazem uso apenas as operações básicas (soma, subitração, multiplicação e divisão).
Sinceramente eu não tenho a menor idéia do que pode estar causando esta demora.
Se alguém puder contribuir com qualquer sugestão, por mais simples ou besta que seja, eu agradeço.
Obrigado a todos.
<?php
class QualquerCoisa
{
private function Calcula($matriz_grupoA, $matriz_grupoB)
{
/*
Estrutura das variáveis $matriz_grupoA e $matriz_grupoB.
Cada um dos arrays pode ter até 500k posições contendo esta estrutura.
$matriz_grupoX[] = array(
'caracteristica1' => "isso",
'caracteristica2' => "aquilo",
'caracteristica3' => 0,
'caracteristica4' => 0,
'caracteristica5' => 0,
);
*/
if((count($matriz_grupoA) <= 0) || (count($matriz_grupoB) <= 0))
{
return;
}
foreach($matriz_grupoA as $unidade_selecionada)
{
$numero_de_unidades = (count($matriz_grupoB) - 1);
$Unidade_Aleatoria = mt_rand(0, $numero_de_unidades);
if($A < $UnidadeB['caracteristica3'])
{
$C = floor(100 * $A / $B);
}
else
{
// Trolóló
}
if(($UnidadeB['caracteristica3'] <= 0) || ($A > 0))
{
if($A <= 0)
{
// Trolóló
}
}
else
{
// Trolóló
}
if($A > 0)
{
if($UnidadeB['caracteristica4'] <= 0)
{
// Trolóló
}
}
if($UnidadeB['caracteristica4'] <= ($D * $E))
{
$F = mt_rand(0, 99);
if($F >= $G)
{
// Trolóló
}
}
}
return $resultado;
}
}
?>Obrigado João.
Eu realmente não havia notado esta redundância.
Eu compreendo que PHP é uma linguagem interpretada e realmente não esperava que ela realizasse o cálculo no mesmo tempo. Demorando de 10 á 20 vezes mais, o que dá uns 10, 20 segundos (na verdade até uns 30 segundos), pra mim ainda seria ótimo !
Quanto ao restante do código, ele realmente não é importante. São contas simples utilizando as 4 operações básicas (somar, subtrair, multiplicar e dividir).
Algo do tipo:
$A = $unidade_selecionada['caracteristica3'] * $matriz_grupoB[$Unidade_Aleatoria]['caracteristica3'];
$B = $A + ($unidade_selecionada['caracteristica4'] / $matriz_grupoB[$Unidade_Aleatoria]['caracteristica5']);
Existe algum problema por eu ter criado um array tão grande (500k posições)?
Acredito que o fato de eu ter dado um nome para as posições do array (Ex: 'caracteristica3') deve gerar um processamento maior do que se a posição fosse representada apenas por um número. Este processamento extra poderia causar uma demora tão significativa devido ao tamanho do array ?
A função mt_rand pode estar causando esta demora por ter que selecionar um número aleatório entre 500k possíveis ?
Obrigado.
Amigo,
A primeira coisa que você precisa compreender sobre PHP é que se trata de uma linguagem interpretada. Você jamais conseguirá desenvolver uma aplicação complexa em PHP com o mesmo desempenho que a mesma aplicação teria se fosse desenvolvida em C++ que é compilada.
Contudo, meia hora é muito tempo. Isso se justifica pelo volume de dados em conjunto com alguns erros cometidos no seu código. Mas sem vê-lo todo, é impossível te ajudar a detectar todos os problemas.
Vou apenas ilustrar o tipo de problema você deve procurar no seu código:
foreach($matriz_grupoA as $unidade_selecionada)
{
$numero_de_unidades = (count($matriz_grupoB) - 1);
A $matriz_grupoB é passada para o método Calcula() e não é modificada dentro do código, dessa forma, sua dimensão permanece imutável. Quando você faz count() a cada iteração do foreach, além de totalmente redundante, você desperdiça recursos e consome tempo desnecessário.
Para se resolver esse problema você faria simplesmente:
{Dessa forma, o $numero_de_unidades continuará disponível no loop e consumirá menos recursos e, consequentemente, menos tempo.