Dans une boucle très serrée, je dois accéder à des dizaines de milliers de valeurs dans un tableau contenant des millions d'éléments. La clé peut être indéfinie: dans ce cas, il sera légal de retourner NULL sans aucun message d'erreur :
- La clé du tableau existe : retourner la valeur de l'élément.
- La clé du tableau n'existe pas : retourner null.
Je connais plusieurs solutions :
if (isset($lookup_table[$key])) {
return $lookup_table[$key];
} else {
return;
}
ou
@return $lookup_table[$key];
ou
error_reporting(0);
$return = $lookup_table[$key];
error_reporting(E_ALL);
return $return;
Toutes les solutions sont loin d'être optimales :
- La première nécessite 2 recherches dans l'arbre B : une pour vérifier l'existence, une autre pour récupérer la valeur. Cela double effectivement le temps d'exécution.
- La deuxième utilise l'opérateur de suppression des erreurs, et crée ainsi une surcharge massive sur cette ligne.
- La troisième appelle le gestionnaire d'erreurs (qui vérifiera le paramètre error_reporting puis n'affichera rien) et crée ainsi une surcharge.
Aurais-je raté une façon d'éviter la gestion des erreurs et pourtant travailler avec une seule recherche dans l'arbre B ?
Pour répondre à quelques questions :
Le tableau met en cache les résultats d'un calcul complexe - trop complexe pour être fait en temps réel. Sur des milliards de valeurs possibles, seuls des millions produisent un résultat valide. Le tableau ressemble à 1234567 => 23457, 1234999 => 74361, .... Cela est enregistré dans un fichier PHP de plusieurs mégaoctets, et inclus au début de l'exécution avec include_once. Le temps de chargement initial n'a pas d'importance.
Si la clé n'est pas trouvée, cela signifie simplement que cette valeur spécifique ne renverra pas un résultat valide. Le problème est de réaliser cela 50k+ fois par seconde.