Valider 9e27e501 rédigé par esj's avatar esj
Parcourir les fichiers

Un optimisation du code produit par le compilateur à laquelle j'aurais dû...

Un optimisation du code produit par le compilateur à laquelle j'aurais dû penser depuis le début: les arguments de la fonction '''calculer_select''' (les clauses Selec, From, etc) sont majoritairement des tableaux invariants, il est couteux de les refabriquer à chaque appel du code compilé d'une boucle (l'amélioration sera donc perceptible pour une boucle imbriquée dans une autre et pour les boucles récursives). On met donc chacun dans une variable qui est déclarée statique lorsque la valeur est effectivement invariante. Et pour une fois, voilà une optimisation qui rend le code plus lisible.

Par contre-coup, optimisation  mineure du critère {{{inverse}}} pour faciliter l'optimisation ci-dessus. Il faudrait aussi optimiser la compilation du critère IN, qui en l'état empêche l'optimisation ci-dessus, la plupart du temps par excès de précaution (c'est seulement en cas de #ENV dans le IN que ça doit l'empêcher).
parent 92427bba
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+24 −28
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -330,35 +330,31 @@ function calculer_requete_sql(&$boucle)
{
	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
		. $boucle->in 
		. $boucle->hash . 
		"\n\n	// REQUETE
	\$result = calculer_select(\n\t\tarray(\"" . 
		. $boucle->hash 
	  . calculer_dec('$table',  "'" . $boucle->id_table ."'")
	  . calculer_dec('$id', "'" . $boucle->id_boucle ."'")
		# En absence de champ c'est un decompte : 
		(!$boucle->select ? 'count(*)' :
		 join("\",\n\t\t\"", $boucle->select)) .
		'"), # SELECT
		' . calculer_from($boucle) .
		', # FROM
		' . calculer_from_type($boucle) .
		', # FROM	type jointure	
		' . calculer_dump_array($boucle->where) .
		', # WHERE
		' . calculer_dump_join($boucle->join)
		. ', # WHERE pour jointure
		' . ('array(' . join(',',array_map('_q', $boucle->group)) . ')') .
		', # GROUP
		array(' .
			calculer_order($boucle) .
		"), # ORDER
		" . (strpos($boucle->limit, 'intval') === false ?
	  . calculer_dec('$from',  calculer_from($boucle))
	  . calculer_dec('$type', calculer_from_type($boucle))
	  . calculer_dec('$groupby', "array(" . join(',',array_map('_q', $boucle->group)) . ")")
	  . calculer_dec('$select', 'array("'
	. (!$boucle->select ? 'count(*)' : join("\",\n\t\t\"", $boucle->select))
			 .  "\")")
	  . calculer_dec('$orderby', 'array(' . calculer_order($boucle) .	")")
	  . calculer_dec('$where', calculer_dump_array($boucle->where))
	  . calculer_dec('$join', calculer_dump_join($boucle->join))
	  . calculer_dec('$limit', (strpos($boucle->limit, 'intval') === false ?
				    "'".$boucle->limit."'" :
			$boucle->limit). ", # LIMIT
		" . calculer_dump_array($boucle->having) . ", # HAVING
		'".$boucle->id_table."', # table
		'".$boucle->id_boucle."', # boucle
		'".$boucle->sql_serveur."'); # serveur";
				    $boucle->limit))
	  . calculer_dec('$having', calculer_dump_array($boucle->having))
	  . "\n\t// REQUETE\n\t"
	  . '$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);';
}

function calculer_dec($nom, $val)
{
  return "\n\t" .(strpos($val, '$') ? '' : 'static ') . $nom . ' = ' . $val . ';';
}

// http://doc.spip.org/@calculer_dump_array
function calculer_dump_array($a)
@@ -855,7 +851,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
		$boucles[$id]->return = 
			"function BOUCLE" . strtr($id,"-","_") . $nom .
			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
			"\n\n\t\$connect = " .
			"\n\n\tstatic \$connect = " .
			_q($boucles[$id]->sql_serveur) .
			";" .
			$req .
+13 −8
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -410,9 +410,10 @@ function critere_parinverse($idb, &$boucles, $crit, $sens='') {
	      }
	  } else $sens ='';

	  $boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order)
	    . $collecte
	    . $sens;
	  $t = ($fct ? "'$fct(' . $order . ')'" : $order) . $collecte . $sens;
	  if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r))
	      $t = $r[1] . $r[2];
	  $boucle->order[] = $t;
	}
}

@@ -437,10 +438,14 @@ function critere_inverse_dist($idb, &$boucles, $crit) {
		}

		$n = count($boucle->order);
	    if ($n)
	      $boucle->order[$n-1] .= " . $order";
	    else
		if (!$n)
			$boucle->default_order[] =  ' DESC';
		else {
			$t = $boucle->order[$n-1] . " . $order";
			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r))
				$t = $r[1] . $r[2];
			$boucle->order[$n-1] = $t;
		}
	  }
}