8
votes

Quelle est l'efficacité du substrateur de PHP?

J'écris un analyseur dans PHP qui doit pouvoir gérer de grandes chaînes en mémoire, il s'agit donc d'une question quelque peu importante. (IE, s'il vous plaît, n'oubliez pas "Optimiser prématuré" Flamme Me, s'il vous plaît)

Comment fonctionne le fonctionnement de la fonction substr ? Est-ce que cela fait une deuxième copie des données de chaîne en mémoire ou fait-il référence à l'original? Devrais-je m'inquiéter d'appeler, par exemple, $ str = substr ($ str, 1); dans une boucle?


2 commentaires

Je penserais que l'affectation serait le tueur, pas le substrateur.


FFI L'extension peut aider, mais elle doit être activée dans PHP. ini


3 Réponses :


1
votes

Oui, vous devez faire attention à une manipulation de chaîne à l'intérieur d'une boucle car de nouvelles copies de la chaîne seront générées sur chaque itération.


1 commentaires

Je ne suis pas un gars PHP, vous pourriez simplement dire que Nope. En Java, il ne crée qu'une nouvelle référence au même tableau de charcuterie immuable. Donc, alors que cela crée un nouvel objet à chaîne, il ne prend pas de stocker plus de copies du tableau de charcuterie sous-jacent. Cela déclare simplement que les compensations seront différentes. Php crée-t-il en fait une nouvelle copie du tableau de caractères? Ou seulement référence au même tableau de caractères.



4
votes

Si vous étudiez vraiment sur l'efficacité, vous devrez garder un pointeur - je veux dire index em> - avec votre chaîne. De nombreuses fonctions de chaîne acceptent un décalage pour commencer à fonctionner à partir de (comme Stros () code> troisième paramètre). Normalement, je recommanderais d'écrire un objet pour envelopper cette fonctionnalité, mais si vous vous attendez à utiliser cela beaucoup, cela pourrait provoquer un goulot d'étranglement de la performance. Voici un exemple de ce que je veux dire (sans OO):

class _String {
    private $string;
    private $startIndex;
    private $length;
    public function __construct($string) {
        $this->string = $string;
        $this->startIndex = 0;
        $this->length = strlen($string);
    }
    public function substr($from, $length = NULL) {
        $this->startIndex = $from;
        if ($length !== NULL) {
            $this->endIndex = $from + $length;
        }
    }
    # other functions you might use
    # ...
}


1 commentaires

Les cordes Java normales font ces choses automatiquement. Pourquoi php?



3
votes

Pour davantage le commentaire de Tchad, votre code nécessiterait à la fois des chaînes (la totalité et le personnage complet-un-minus-tire-première) pour être en mémoire simultanément (bien que non due à l'affectation comme Tchad indiquée) . Voir:

MEM:  1093256
PEAK: 1093488
MEM:  1093280
PEAK: 2142116  :-(
MEM:  1093276
PEAK: 2142116  :-(


0 commentaires