Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Rekursiv funktion och CPU-användning

Postades av 2006-01-06 16:10:00 - Mikael Jönsson, i forum c# (c-sharp), Tråden har 30 Kommentarer och lästs av 578 personer

Hej,

För ett tag sedan, nästan ett halvår, så startade jag en tråd om en rekursiv funktion som var väldigt seg (http://www.pellesoft.se/communicate/forum/view.aspx?msgid=189844).

Den funktionen har jag nu gjort om lite och den är väldigt snabb, men nu är problemet att efter den har listat allting i en ListView, så går CPU-användnigen upp och stannar där.

Hur mycket CPU programmet tar tycks bero på hur många items man har i listan. Om jag har ~1800 items så tar programmet ca 40-50% av CPU:n och >3000 så är det uppe i 90-99%.

Är det något fel på min funktion eller har någon en aning om vad det är som orsakar detta?

<code>
public void GetFilesAndDirectoriesRecursive(string myParentDirectory, ListView myListView)
{
SetStatus(myParentDirectory);

#region Get Files
string[] myFiles = Directory.GetFiles(myParentDirectory);

for(int j = 0; j < myFiles.Length; j++)
{
if(myStopRecursiveScan) return;

if((File.GetAttributes(myFiles[j]) & FileAttributes.System) != FileAttributes.System)
{
if(FilterFile(Path.GetFileName(myFiles[j]), textBoxFilter.Text, checkBoxMatchCase.Checked, checkBoxRegExp.Checked))
{
ListViewItem myItem = new ListViewItem(myFiles[j].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""), 1);
myItem.SubItems.Add(myFiles[j].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""));
myItem.SubItems.Add("No Change");
myItem.SubItems.Add(ConvertBytes(new FileInfo(myFiles[j]).Length));
myItem.SubItems.Add(Path.GetExtension(myFiles[j]).Replace(".", "").ToUpper());
myItem.SubItems.Add(File.GetCreationTime(myFiles[j]).ToShortDateString());
myItem.SubItems.Add(File.GetLastWriteTime(myFiles[j]).ToShortDateString());
myItem.SubItems.Add(File.GetLastAccessTime(myFiles[j]).ToShortDateString());
myItem.Tag = myFiles[j];

// myRecursiveItems är en ArrayList
myRecursiveItems.Add(myItem);

progressBar.Value++;
}
}
}
#endregion

#region Get Directories
string[] myDirectories = Directory.GetDirectories(myParentDirectory);

for(int i = 0; i < myDirectories.Length; i++)
{
if(myStopRecursiveScan) return;

if((File.GetAttributes(myDirectories[i]) & FileAttributes.System) != FileAttributes.System)
{
if(FilterDirectory(Path.GetDirectoryName(myDirectories[i]), textBoxFilter.Text, checkBoxMatchCase.Checked, checkBoxRegExp.Checked))
{
ListViewItem myItem = new ListViewItem(myDirectories[i].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""), 0);
myItem.SubItems.Add(myDirectories[i].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""));
myItem.SubItems.Add("No Change");
myItem.SubItems.Add("0 B");
myItem.SubItems.Add("<DIR>");
myItem.SubItems.Add(Directory.GetCreationTime(myDirectories[i]).ToShortDateString());
myItem.SubItems.Add(Directory.GetLastWriteTime(myDirectories[i]).ToShortDateString());
myItem.SubItems.Add(Directory.GetLastAccessTime(myDirectories[i]).ToShortDateString());
myItem.Tag = myDirectories[i];

myRecursiveItems.Add(myItem);

progressBar.Value++;
}
}

Application.DoEvents();

GetFilesAndDirectoriesRecursive(myDirectories[i], myListView);
}
#endregion
}
</code>

Jag lägger sedan till filerna och mapparna med
<code>
SetStatus("Filling... (" + myRecursiveItems.Count + " Files And/Or Folders)");
listViewFiles.BeginUpdate();
listViewFiles.Items.Clear();
listViewFiles.Items.AddRange((ListViewItem[])myRecursiveItems.ToArray(typeof(ListViewItem)));
listViewFiles.EndUpdate();
SetStatus("Ready");
</code>

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-06 19:46:17 - Oskar Johansson

Någon skillnad om du listar med/utan ikoner? Annat visningsläge?


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-06 20:22:03 - Mikael Jönsson

Nej, ingen skillnad, tyvärr.

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-06 21:16:45 - Thomas Axelsson

Det är inte så att ListViewen egentligen skapar om en statisk array varje gång man lägger till nåt? (lr efter en viss bufferlängd)


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-06 21:45:43 - Oskar Johansson

Vad händer om du kommenterar bort "add"-raderna (inte addrange alltså)?


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-07 12:48:34 - Mikael Jönsson

Thomas: Det har jag väl kommit ifrån isåfall genom att använda AddRange()?

Oskar: Det går snabbare men CPU-användningen går inte ner.

/Micke


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-08 16:38:55 - Oskar Johansson

Fundering: När den är klar, var stannar koden om du pausar? (Kolla alla trådarna)


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-08 19:17:26 - Mikael Jönsson

Är inte säker på att jag förstår vad du menar. Funktionen körs just nu inte på en egen tråd eftersom det visade sig gå långsammare då. Kommenterar jag bort AddRange() så går CPU-användningen inte upp, så det måste vara där felet ligger.

/Micke


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-08 19:58:50 - Oskar Johansson

Har tittat lite på addrange-funktionen och den är lite skum, testa vad som händer om du loopar in rubbet istället och kör med vanliga add-metoden


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-08 20:08:17 - Mikael Jönsson

Det tar flera minuter att lägga till dom istället för ~5 sekunder med AddRange och CPU-användningen går inte upp.

/Micke


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-08 22:01:34 - Oskar Johansson

Har du sortering påslagen?


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-08 22:23:31 - Mikael Jönsson

Ja, men det blev ingen skillnad när jag inaktiverade den.

/Micke


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-08 22:49:08 - Oskar Johansson

Bytte du den här raden: listViewFiles.Items.AddRange((ListViewItem[])myRecursiveItems.ToArray(typeof(ListViewItem)));
Mot något i stil med?
foreach(ListViewItem lvi in myRecursiveItems)
{
this.listViewFiles.Items.Add(lvi);
}


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-08 23:05:57 - Mikael Jönsson

Precis, fast med en vanlig for-sats.

/Micke


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-09 00:03:17 - Oskar Johansson

Testa att stänga av lite kolumner och se ifall det ger någon skillnad.
(Tycker alltihopa bara låter suspekt... Känns som att det inte finns någon logik i det :P )


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-09 00:56:24 - Mikael Jönsson

» Testa att stänga av lite kolumner och se ifall det ger någon skillnad.

Har redan provat och det gör ingen skillnad.

» (Tycker alltihopa bara låter suspekt... Känns som att det inte finns någon logik i det :P )

Visst gör det, har sökt och sökt och sökt men inte hittat någon som har haft ett liknande problem.


Jag har testat med lite olika antal mappar och filer, och det verkar som om det uppstår när det finns fler än 500 items i listan. Då är CPU-användningen mellan 13-16%. Har även gjort två andra test-program i både VB.NET och C# och lagt till 30000 items utan problem.


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-09 01:22:05 - Mikael Jönsson

Nu hittade jag det!

Det verkar vara CheckBoxarna som visas bredvid som gör det. Men det är lite konstigt att samma sak inte uppstår i de nya projekten jag gjorde. Där lägger jag till 30000 items och CPU-användningen går inte upp ett dugg.

Några idéer? Vill ju gärna ha checkboxarna i listan...

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-09 08:39:38 - Oskar Johansson

Vad händer om du slår av/på teman?

(Finns det verkligen inte någon skillnad mellan ditt projekt och de fungerande testprojekten?)


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-09 12:29:04 - Mikael Jönsson

» Vad händer om du slår av/på teman?

Ingen skillnad.

» (Finns det verkligen inte någon skillnad mellan ditt projekt och de fungerande testprojekten?)

Det måste ju finnas någon skillnad, kan inte hitta den bara :)
Jag har provat med/utan ikoner, kolumner, manifest-fil, teman, progressbar, sortering och olika views.


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-09 17:21:18 - Oskar Johansson

Lägger du till sakerna på samma sätt?


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-09 17:28:26 - Mikael Jönsson

I test-projekten lägger jag till en massa listviewitems i arraylisten, jag använder alltså inte den rekursiva funktionen där eftersom det inte var där det var fel. Och sen använder jag AddRange på samma sätt.
De items jag lägger till i test-projekten innehåller ungefär lika mycket data som i det "riktiga" programmet.

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-09 21:16:05 - Oskar Johansson

Vilken rad stannar programmet på när du pausar?


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-09 22:30:10 - Mikael Jönsson

Nu snackar du om att pausa igen... hur gör man det?

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-10 00:30:12 - Oskar Johansson

När du debuggar, tryck på den knapp som ser ut som en paus-knapp (||) i verktygsfältet. Om den inte finns där, leta i debug-menyn


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-10 01:31:38 - Mikael Jönsson

Okej, den verkar stanna i slutet av Main-metoden.

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-10 17:16:56 - Oskar Johansson

Skumt... Har ganska slut på idéer nu :/


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-10 18:19:49 - Peter Ilis

Antar att det är du som skrivit frågan på Expert Exchange också? Där finns lösningen iaf:
http://www.experts-exchange.com/Programming/Programming_Languages/Dot_Net/VB_DOT_NET/Q_21611070.html

Hade ett annat problem förut med en rekursiv funktion som skulle köras extremt många gånger (ca 10^50) och fick det aldrig att fungera. Vet inte om funktionspekarlistan eller vad som nu används av .Net för att hålla koll på var den är i exekveringen blev överfull men det fick inte så som jag skrivit det.. Slutade med att jag använde 'Goto' ;)

Men det borde inte vara några som helst problem i det här fallet iaf.

Mvh
Peter


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-10 18:36:18 - Mikael Jönsson

Nej, det är inte jag, och jag tror inte att det är samma problem. Mitt problem handlar inte längre om den rekursiva funktionen som jag trodde, utan något som händer efter att alla items lagts till. Såhär ser mitt problem ut:

» Den rekursiva funktionen sätts igång med start i "Mina dokument" (ca 1800 filer och mappar)
» Alla filer och mappar ligger nu i en ArrayList och än har CPU-användningen inte gått upp
» ArrayList:en läggs till i ListView:n med AddRange()
» CPU-användningen går upp till ett visst antal procent beroende på hur många items som lagts till.

Nu har jag märkt att detta inte händer om jag väljer att inte visa "CheckBoxes" i ListView:n.

Men! Nu kommer det konstiga...

Om jag skapar ett nytt projekt och lägger till 30000 items i en ArrayList och använder AddRange på samma sätt, så går CPU-användningen inte upp även om jag har "CheckBoxes" aktiverat.


Oskar: Tack för dina idéer hittills!

/Micke


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-10 19:34:29 - Niklas Jansson

<b>extremt många gånger (ca 10^50)</b>
Extremt var ordet. Du menar alltså att du väntade si så där 10^30 år på att det skulle bli klart?


Svara

Sv:Rekursiv funktion och CPU-användning

Postades av 2006-01-10 19:46:34 - Peter Ilis

<b>Extremt var ordet. Du menar alltså att du väntade si så där 10^30 år på att det skulle bli klart?</b>
Den gick aldrig så många gånger. Var en Sudoku-testare som försökte testa alla möjliga varianter helt utan "smart" logik eller regler tills den hittade en lösning. Den tog förresten ungefär 9 timmar att hitta en lösning när jag försökte på en (med goto eftersom rekursionen inte gick av någon anledning). :-)

9!^9 antal möjliga lösningar finns det vilket väl ungefär blir 10^50.

Mvh
Peter


Svara

Sv: Rekursiv funktion och CPU-användning

Postades av 2006-01-11 00:35:51 - Niklas Jansson

Utan att använda några som helst regler så får du 9^81 lösningar, c:a 10^77.
Du kanske räknar 9 tal fördelade per rad (9!) och 9 rader (^9). Ja, det stämmer ju i så fall.

Sannolikt kolar en rent rekursiv lösning ganska snabbt, minnesmässigt, så det verkar rimligt.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 167
27 952
271 704
662
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies