7
votes

Rails Application Config Access lent - pourquoi?

Nous avons toujours utilisé la configuration de notre application dans les fichiers de l'environnement. Ce n'est pas bon pour la gestion de la production, alors nous le chargons maintenant via une initiative: xxx pré>

dès que nous avons commencé à accéder à la configuration via ApplicationConfig code>, la performance des tests d'application a beaucoup pire. Une suite RSPEC est tombée de 4 secondes à 30. P>

Dans notre contrôleur d'application, nous devons prendre des mesures à l'aide d'un avant_filter code>, qui fonctionne comme suit: p>

config = ApplicationConfig

def extra_control
  if config.some_flag
    ...
  end
end


8 commentaires

Est-ce que cela ne pire que dans l'environnement de test? Avez-vous vérifié à quelle étape de votre environnement de test L'initialiseur est appelé? Vous pouvez le faire via un débogueur ou en ajoutant une certaine impression.


Je n'ai aucune donnée sur le fait que ce n'est que lent au test, mais je sais que l'initialiseur est appelé exactement une fois à la fois en test et en développement - ce n'est donc pas un appel d'initialisateur répétitif le ralentissant.


Remarque: le ralentissement des performances est uniquement lorsque vous accédez directement à l'applicationConfig, cela disparaît lorsque vous l'attribuez à une variable, comme indiqué ci-dessus.


Hmm, cela ne se reproduit pas pour moi. Avez-vous essayé de profiler vos tests? Peut-être que quelque chose à voir avec la façon dont ils sont mis en œuvre?


Quelle est la taille de votre fichier de configuration?


Le fichier de configuration compte environ 20 entrées. J'ai également confirmé qu'il est lu exactement une fois . Il est toujours plus lent de faire référence à ApplicationConfig que d'attribuer à une variable puis de lire, comme indiqué ci-dessus.


@XCUT avec la réputation 3K Vous devez savoir maintenant que sur les sites d'échange de pile, nous voulons des personnes qui posent des questions à accepter des réponses, et non modifier le titre pour inclure «Résolu». Si cela signifie que vous devez écrire votre propre réponse, c'est bien, mais veuillez accepter une réponse à la question. Si rien d'autre, cela définit un bon exemple pour les autres.


@xcut merci! Maintenant faire quelque chose avec la prime. Comme personne n'a résolu le problème pour vous, peut-être le donner à quiconque a fait le plus ou le meilleur travail.


4 Réponses :


0
votes

Je ne peux pas parler de la raison pour laquelle votre approche est lente, mais peut-être une manière différente de manipuler des paramètres serait la peine d'être examinée. Je préfère l'idée d'avoir une classe singleton contenant des informations de configuration: xxx

le discours L'application prend une approche similaire.


1 commentaires

Merci d'avoir fait l'effort - la question n'était pas liée à la fin. FYI, nous chargons un fichier YamL puis précipitez Hashie pour générer un objet, cela fonctionne très bien, sans succès de performances.



0
votes

Essayez Utiliser Const:

applicationconfig = yaml.load (fichier.read (fichier.expand_path ("# {rails_root} /config/application/default.yml", __file __)))

ou

ApplicationConfig = yaml :: charge (fichier.open ("# {rails_root} /config/application/default.yml"))

Je pense que c'est de rendre votre fichier lent car le fichier de chargement mais ne pas ouvrir / lire.


1 commentaires

Cela n'a fait aucune différence de vitesse, j'ai peur.



0
votes

Je pense que cela aidera à déterminer si le fichier YAML charge \ lue est lent ou que l'analyse YAML est lente. Je suppose que Ruby analyse le fichier YamL chaque fois que vous appelez votre ApplicationConfig variable. Pouvez-vous essayer de le renommer à Application_Config Comme: XXX

Veuillez ne pas injecter une variable d'instance dans tous vos contrôleurs :)


1 commentaires

Cela n'a fait aucune différence de vitesse, j'ai peur.



0
votes

Les autres réponses ici n'ont pas fait de différence - cela a été causé par un problème sans rapport. Pour l'enregistrement

  • Les initialisateurs sont appelés exactement une fois par RSPEC
  • Il ne fait pas de différence si l'applicationConfig ou l'application_config est utilisée
  • l'affectation à une variable n'a pas fait de différence de vitesse

0 commentaires