Jeg sidder og er igang med at lave et program der skal bruges til at indlæse data fra en ISA 2004 logfil.
Jeg få da også lagt al dataen ind i en ArrayList hvorefter at jeg deler al dataen op og ligger det ned i et 2 dimisionelt array.
Den data som jeg har smidt ned et mit array bliver så filteret alt efter om action er "Allowed" eller "Denied". Imens at det bliver filteret bliver det smidt ned i 2 ListViews.
Mit problem er så at når jeg smider dataen ned i et ListView så tager det ca. 7 min før at den er færdig med at ligge alt ned i den.
Nogen der har en idé om hvorfor den er så lang tid om den lille del?
Min kode som smider det ned i ListViewet:
if (sentences[b][i-2].ToString() == "Allowed") { ListViewItem lvi = new ListViewItem(sentences[b][3]); for (int a = 4; a < sentences[b].Length; a++) { lvi.SubItems.Add(sentences[b][a]); } lw_allowed.Items.Add(lvi); }
1) Hvor mange linjer er din log-fil på? En meget stor fil vil alt andet lige tage længere tid, og måske er 7 minutter bare den tid det nødvendigvis tager...
2) Denne kode-blok:
while (sr.Peek() != -1) { dump = sr.ReadLine(); if (Regex.IsMatch(dump,"anonymous")) {} else { if (Regex.IsMatch(dump, "#") || Regex.IsMatch(dump, OpenDir.MIME_Type.ToString())) { myAL.Add(dump); } } }
- kan meget mere effektivt skrives som:
string odm = OpenDir.MIME_Type.ToString(); while ((dump = sr.ReadLine() != null) { if (dump.IndexOf("anonymous") == -1) { if (dump.IndexOf("#") != -1 || dump.IndexOf(odm) != -1) { myAL.Add(dump); } } }
3) Tager din kode også 7 minutter, hvis du inkludere denne kode-blok:
if (sentences[b][i-2].ToString() == "Allowed") ...
- i din udkommentering?
4) Til sidst et godt råd: Du burde overveje seriøst om ikke du skulle definere dine variable der hvor du bruger dem. Lige nu bruger din kode dusinvis af variable, som må være defineret et helt andet sted. Det gør det svært at overskue koden, og det giver massere af muligheder for at der er indsniger sig fejl af den vej.
1. Den logfil som tager 7 min at indlæse ind i mit listview er på ca. 36000 linier 3. Ja den tager stadigvæk 77 min hvis den if sætning er udkommenteret.
1) Din kode er ikke specielt let at læse. F.eks. bruger du variablen b i:
while (b < myAL.Count)
- uden at den er defineret, og initialiseret, noget sted i den vise kode. Den må altså være defineret et helt andet sted og det er derfor også uklart hvad den starter på (selv om jeg gætter på værdien 0).
På samme måde bruger du i'et i:
if (sentences[b][i-2].ToString() == "Allowed")
Du har godt nok også en for-løkke som gør noget med denne på et tidligere tidspunkt, men rent strukturmæssigt er det ikke pænt at gøre det på den måde.
I OOP er det en gylden regel at man bør prøve at begrænse antallet af globalt definerede variable til et minimum.
2) Du har en hovedløkke:
while (b < myAL.Count) { ... }
- og inden i den laver du en masse udregninger som ikke afhænger af b. Et godt eksempel er f.eks. din allerførste for-løkke:
while (b < myAL.Count) { for(ix = 0; ix < myAL.Count; ix++) { st = (string)myAL[ix]; sentences[ix] = st.Split(null); }
... }
Der er ingen grund til at gentage denne for-løkke en gang for hver while-gennemløb, og den bør derfor trækkes udenfor. Hvis du gør dette for alle tilsvarende konstruktioner, vil du sikkert få et gevaldigt hastighedsløft bare der!
3) Hvis du derefter stadig oplever problemer, så prøv at kommentere mere og mere af din kode ud, indtil at du har fundet ud af hvad det er der virkeligt trækker tænder ud.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.