2009-02-10 6 views
0

J'ai beaucoup de différents modèles regex automatiquement chargés chaque fois que mon script greasemonkey commence. 95% de cette mémoire chargée n'est pas nécessaire à aucun moment, donc je voudrais trouver un moyen de ne même pas mettre ces données en mémoire pour commencer si je sais qu'il ne sera pas utilisé.Javascript: chargement quantité de données de la mémoire en fonction de la condition

Prenez ce un exemple de base:

var patterns = [ 
    { 
    name : 'p1', 
    url  : 'http://www.someurl.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }, 
    { 
    name : 'p2', 
    url  : 'http://www.someurl2.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }, 
    { 
    name : 'p3', 
    url  : 'http://www.someurl3.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }, 

]; 

.... et bien d'autres modèles.

Je n'ai pas besoin de charger les données si l'URL ne correspond pas à l'URL actuelle (location.href).

+0

Je ne suis pas sûr de comprendre. Pouvez-vous développer un peu? –

Répondre

3

Le meilleur moyen est de pouvoir charger des données à la demande via GM_getResourceText + eval. Les données de ressources définies dans le bloc de métadonnées seront téléchargées lors de la première installation de l'utilisateur.

Documentation: http://wiki.greasespot.net/Metadata_block#.40resource

Vous devez penser comment stocker les données - peut-être une ressource par site (je sais méchant)?

Une autre solution plus simple pour résoudre les problèmes de performances consiste à stocker les expressions régulières sous forme de chaînes simples et à créer des objets RegExp uniquement lorsque cela est nécessaire. Par exemple: patterns : [".", ".", "."] et new RegExp(the_pattern) lorsque l'expression est réellement nécessaire.

+0

C'est une très bonne façon de le faire, surtout en ce qui concerne seulement l'initiation des modèles en cas de besoin. Cela pourrait être mis en œuvre immédiatement. –

1

Utilisez un document.write() pour inclure les données d'un fichier javascript séparé si et seulement si cela est nécessaire.

+0

Je pense que vous avez mal compris la question ... –

0

Puisqu'il s'agit d'un script GreaseMonkey, je suppose qu'il réside sur la machine de l'utilisateur, et non sur un site externe. Si ce n'est pas le cas, vous pouvez envisager de générer le JavaScript à la volée en fonction de l'URL. Sinon, vous pouvez stocker l'assignation de modèle JavaScript dans des fichiers séparés, récupérer un seul des fichiers en fonction de l'URL du site chargé et exécuter son contenu via eval() comme s'il s'agissait d'une requête JSON.

+0

J'ai pensé à faire cela, mais ne devrais-je pas avoir des milliers de fichiers javascript et beaucoup de données de duplication? Cela pourrait devenir très désordonné. Idéalement, je voudrais une fonction intégrée dans javascript qui ne charge que ce qui est dans la var quand on y accède. –

1

Vous pouvez coller avec votre définition actuelle de modèles et de supprimer tous les modèles que vous n'avez pas besoin:

var patterns = [ 
    //patterns array as defined in question 
]; 
var newpatterns = []; 
var count = 0; 

for (var i = 0 ; i < patterns.length ; i++){ 
    if (href.indexOf(patterns[i].url) == -1) { 
    newpatterns[count++] = patterns[i]; 
    console.log("remove " + patterns[i].name); 
    } 
} 
patterns = newpatterns; 

Bien que cette façon vous le charger encore tous en mémoire d'abord, mais pas vous tenir des objets n'ont pas besoin de toute la durée de vie de la page.

Un meilleur moyen serait de tester chaque objet un par un, avant qu'il ne soit ajouté au tableau de modèles, et ajoute uniquement des objets pertinents pour l'URL actuelle.

var patterns = []; 
var count = 0; 

var href = window.location.href; 

function addPattern(p){ 
    if (href.indexOf(p.url) != -1) patterns[count++] = p; 
} 

addPattern({ 
    name : 'p1', 
    url  : 'http://www.someurl.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }) 

addPattern({ 
    name : 'p2', 
    url  : 'http://www.someurl2.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }) 

addPattern({ 
    name : 'p3', 
    url  : 'http://www.someurl3.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }) 
+0

C'est une bonne idée mais cela ne fonctionne pas vraiment car vous chargez toujours l'objet en mémoire, en passant l'objet à une fonction puis en chargeant l'objet dans une autre partie de la mémoire. On dirait plus de travail qu'avant! ;-) –

+0

ceci charge seulement un modèle à la fois, et il gardera seulement dans la mémoire ceux qui sont appropriés à la page. –

Questions connexes