2012-06-05 3 views
0

Ci-dessous vous voyez le code de mon calendrier pour un site Web, le problème est que ce code prend environ 8-10 sec à charger. Si l'un d'entre vous peut voir un moyen de minimiser le temps de chargement, je serais reconnaissant.Diminuer le temps de chargement sur le calendrier

public static IEnumerable<DateTime> AllDatesInMonth(int year, int month) 
    { 
     foreach (var day in Enumerable.Range(1, DateTime.DaysInMonth(year, month))) 
     { 
      yield return new DateTime(year, month, day); 
     } 
    } 

    public void ForeachDayInMonth(int year, int month, SqlConnection connection) 
    { 
     int day; 
     int count; 
     double divHeight; 

     lbl_Month.Text += "<table class=\"Month\">"; 
     foreach (DateTime date in AllDatesInMonth(year, month)) 
     { 
      day = int.Parse(date.ToString().Substring(0, 2)); 
      count = Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection).Count; // Creates a sql select statement 

      lbl_Month.Text += "<tr>" + 
       "<td style=\"height: 30px; width: 70px;"; 

      if (date.Date == DateTime.Today) 
      { 
       lbl_Month.Text += "-webkit-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "-moz-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);"; 
      } 

      lbl_Month.Text += "\">"; 

      if (count != 0) 
      { 
       divHeight = 100/count; 

       foreach (Begivenheder b in Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection)) // creates a sql select statement 
       { 
        lbl_Month.Text += "<div style=\"background-color: " + b.begivenhed.type.TypeFarve + "; height: " + divHeight + "%;\">" + 
         "<a href=\"KalenderEvent.aspx?Event=" + b.begivenhed.ID + "\">"; 
        if (b.begivenhed.Navn.Length > 9) 
        { 
         lbl_Month.Text += b.begivenhed.Navn.Remove(9) + "..."; 
        } 
        else 
        { 
         lbl_Month.Text += b.begivenhed.Navn; 
        } 
        lbl_Month.Text += "</a>" + 
         "</div>"; 
       } 
      } 

      lbl_Month.Text += "</td>" + 
       "</tr>"; 
     } 
     lbl_Month.Text += "</table>"; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     string year; 

     if (Request.QueryString["Year"] == null) 
     { 
      year = DateTime.Today.Year.ToString(); 
     } 
     else 
     { 
      year = Request.QueryString["Year"]; 
     } 

     Page.Title += " - Kalender " + year; 

     SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["Database"]); 
     connection.Open(); 
     try 
     { 
      Year(int.Parse(year), connection); 
     } 
     finally 
     { 
      connection.Close(); 
     } 
    } 

    private void Year(int year, SqlConnection connection) 
    { 
     string thisYear = year.ToString(); 
     int lastYear = year - 1; 
     int nextYear = year + 1; 

     lbl_Year.Text = "<div>" + 
      "<a href=\"Kalender.aspx?Year=" + lastYear.ToString() + "\" id=\"LastYear\"></a>" + 
      "</div>" + 
      "<div>" + 
      thisYear + 
      "</div>" + 
      "<div>" + 
      "<a href=\"Kalender.aspx?Year=" + nextYear.ToString() + "\" id=\"NextYear\"></a>" + 
      "</div>"; 

     lbl_Month.Text = "<table>" + 
      "<tr>" + 
      "<td>"; 
     // Dage 
     lbl_Month.Text += "<p>" + 
      "</p>" + 
      "<br />" + 
      "<table>"; 
     for (int i = 1; i <= 31; i++) 
     { 
      lbl_Month.Text += "<tr>" + 
       "<td style=\"height: 30px;\">" + 
       "<p>" + 
       i.ToString() + 
       "</p>" + 
       "</td>" + 
       "</tr>"; 
     } 
     lbl_Month.Text += "</table>" + 
      "</td>"; 

     //Januar (repeats 12 times, ones for each month) 
     lbl_Month.Text += "<td>" + 
      "<p>" + 
      "Januar" + 
      "</p>"; 
     ForeachDayInMonth(int.Parse(thisYear), 1, connection); 
     lbl_Month.Text += "</td>"; 

     lbl_Month.Text += "</tr>" + 
      "</table>"; 
    } 

Heres le code "Begivenheder.Get_Begivenhed_By_Date". Je sais que c'est un tas de code, mais je n'ai aucune idée de la façon de le diminuer.

+0

Je viens d'éditer votre titre car il a dit le contraire de votre question :) – BlackBear

+0

n'a pas vu cela, merci ^^ –

Répondre

2

Chaque page_load conduit à des requêtes de base de données cca 30 - Voilà une beaucoup de frais généraux, essayer de réorganiser si vous avez seulement besoin de parler la base de données une fois, voire pas du tout. En outre, obtenez un profileur .NET et voyez où vous passez le plus de temps.

1

L'optimisation de base des chaînes ferait une grande différence. Si vous avez string +=, utilisez plutôt un générateur de chaînes. Ensuite, lorsque tout le calcul est terminé, convertissez StringBuilder en une chaîne avec la méthode .ToString().

Voir MSDN StringBuilder Class

Remplacez également le code string + string + string avec les méthodes de AppendFormat

+2

Relatif aux hits de la base de données et l'objectif de réduire une charge de 10 secondes, c'est probablement négligeable. –

2

Vous pouvez améliorer les performances en récupérant tous les événements pour l'intervalle entier, au lieu d'effectuer une requête pour chaque date. Il semble que vous voulez tous les événements en un mois, compte tenu de votre modèle de données actuel qui est un changement facile.

Si vous faites choisir d'effectuer une requête par jour, réutiliser le même SqlCommand en ajoutant SqlParameters à elle, au lieu de reconstruire une nouvelle marque 28-31 fois.

1

1) Utilisation:

day = date.Day; 

au lieu de:

day = int.Parse(date.ToString().Substring(0, 2)); 

2) Mettre ce long style dans une feuille de style/CSS, et utiliser une courte class = 'name' au lieu:

webkit-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "-moz-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8); 

3) Vous appelez Begivenhed_By_Date deux fois par jour:

1)  count = Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection).Count; 
2) foreach (Begivenheder b in Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection)) 
could be: 
+) List<Begivenheder> hedByDate = Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection); 
1.x count = hedByDate.Count; 
2.x foreach (Begivenheder b in hedByDate, connection)) 

4) Utilisez au moins StringBuilder pour concaténer les chaînes lbl_Month.Text + = en premier, puis attribuez-le en dernier.

5) Vous cherchez à utiliser les contrôles Repeater, vous n'avez donc pas besoin d'encombrer votre code avec du code HTML comme celui-ci.

6) Modifiez-le pour ne faire qu'une seule requête SQL au lieu de plusieurs fois.

Questions connexes