giovedì 27 giugno 2013

MVC4 - Bundles - problema memoria

Buonasera a tutti.

Scrivo questo posto perché ho notato che le funzionalità di minificazione dei file javascript, fornite dalla Dll System.Web.Optimization, sono molto costose in termini di risorse di memoria. In particolare, su un applicativo in produzione, la sola minificazione dei file javascript allocava 50Mb di memoria RAM, a fronte di un insieme di file che pesano si e no 2Mb.

Ho spiegato come minificare file javascript e css in questo articolo :
MVC4 Minificazione file Javascript e CSS (Creazione Bundle)

Ora ecco un caso pratico:

Ho provato a creare un progetto MVC 4, con templates Razor.

Nel progetto base vengono creati 3 bundle per i javascript.

Ogni bundle richiamato (es. @Scripts.Render("~/bundles/jquery")) fà aumentare la memoria consumata di ca. 4Mb. Nella mia applicazione i Javascript sono diversi e quindi è probabile che sia per quello che arrivo a consumare 50Mb.

La cosa mi lascia molto perplesso perché a fronte di pochi Kb di script vengono allocati alcuni Mb in memoria.
Nella mia realtà aziendale, dove sullo stesso server sono installati diversi siti, questo è un problema non indifferente.

Credo che a questo punto l'unica soluzione sia quella di minificare e mergiare  i file in fase di compilazione e mettere il link diretto al file minificato nelle pagine. Purtroppo così allungo i tempi di produzione/bug fixing e aumentano le possibilità di errore (pubblicando solo i file non minificati e lasciando all'helper "Scripts" l'operazione di minificazione e merge, ho la certezza di quale file stia usando il sito e ho la possibilità di debuggare eventuali errori presenti solo in produzione).

Dopo alcune prove credo di aver isolato il problema.
Il consumo di memoria deve essere legato alle Trasformazioni, ovvero al processo dii minificazione, perchè sostituendo nella creazione dei bundle

System.Web.Optimization.ScriptBundle

con

System.Web.Optimization.Bundle

i file javascript vengono accodati in un unico file, non avviene la minificazione e la memoria utilizzata è quasi trascurabile.


Consiglio quindi di procedere in questo modo:


  • minificare i file javascript alla compilazione, magari utilizzando le librerie di "YUI Compressor" o "Ajax Minifier"
  • usare i bundle delle "System.Web.Optimization", senza la parte di minificazione "on the fly"

Spero di esservi stato utile.

---------------------

Luca Dalsass
Solution Architect and Development Manager at Totalcom Srl



Nessun commento:

Posta un commento