Netzwerk Abfragen Performance

paebels

Erfahrenes Mitglied
Hallo,
ich habe ein Performance Problem. Ich lese Remote Verzeichnisse aus und zwar Freigaben auf die ich auch Zugriff habe.Also Berechtigungen ist alles ok. So nun lese ich kleine Verzeichnisse recht schnell aus. Die Dateien werden schnell angezeigt in der View.
So nun das Problem stoße ich etwa auf ein Verzeichnis welches Bilder beinhaltet die ca 2MB groß sind und dann davon 100MB gesamt,dauert es sehr lang bis die Dateien angezeigt werden. Sie werden nur als Text angezeigt. Es muss schneller gehen , da ich Sie schneller Angezeigt bekomme wenn ich Windows selbst benutze um Sie mir anzuschauen.
Hier der Code
Code:
void CVerzeichnisse::dateien_ermmitteln(System::Windows::Forms::ListView^ listview1, System::String^ root )
{
	try
	{
		listview1->Items->Clear();
		System::IO::DirectoryInfo^ info = gcnew System::IO::DirectoryInfo(root);
		int zaehler = 0;
		zaehler = info->GetFiles()->Length;
		if(zaehler !=0)
		{
			listview1->BeginUpdate();
			for (int i = 0 ; i<zaehler; i++)
			{
				System::String^ er = info->GetFiles()[i]->ToString();
				//System::IO::FileInfo^ er = info->GetFiles()[i];
				listview1->Items->Add(er->ToString());
			}
			listview1->EndUpdate();
		}
	}
	catch(System::UnauthorizedAccessException^ e)
	{
		listview1->Items->Clear();
		MessageBox::Show(e->Message);
	}	
}
Hat da einer eine Idee woran es liegt?Listview update mache ich nur aus Gewohnheit kann auch weg, bringt aber an Geschwindigkeit nichts.
MFG

Oli

p.s c++ wie man erkennen kann ;-)
 
Zuletzt bearbeitet:
Ich sag mal danke. IEnummerator geht mir halt noch nicht ab ;-)
In C# macht das halt immer die foreach wenn ich mich nicht irre automatisch.

Alles sieht nun so aus :Danke für den Anstoß ich war wieder zu dämlich!
Code:
void CVerzeichnisse::dateien_ermmitteln(System::Windows::Forms::ListView^ listview1, System::String^ root )
{
	try
	{
		listview1->Items->Clear();
		System::IO::DirectoryInfo^ info = gcnew System::IO::DirectoryInfo(root);
		array<System::IO::FileInfo^>^ er = info->GetFiles();
		int zaehler = 0;
		zaehler = info->GetFiles()->Length;
		if(zaehler != 0)
		{
			listview1->BeginUpdate();
			for (int i = 0 ; i<zaehler ; i++)
			{
				//System::IO::FileInfo^ er = info->GetFiles()[i];
				listview1->Items->Add(er[i]->ToString());
			}
			listview1->EndUpdate();
		}
	}
	catch(System::UnauthorizedAccessException^ e)
	{
		listview1->Items->Clear();
		MessageBox::Show(e->Message);
	}	
}

Ich glaube man merkt das ich Anfänger bin.
 
Zuletzt bearbeitet:
Hallo

ich habe leider noch immer Performane Probleme mit der Listview.
Bei großen Verzeichnissen ist die Anzeige einfach zu langsam im Netzwerk.
Ich versteh nicht wieso der Explorer hat die Dateien sofort, auch wenn er Sie im Cache hat es müsste bei der Anwendung die ich geschrieben habe auch schneller gehen.
Sieht wer das Problem im Code************
Code:
void CVerzeichnisse::dateien_ermmitteln(System::Windows::Forms::ListView^ listview1, System::String^ root )
{
	try
	{
		System::Collections::Generic::List<System::Windows::Forms::ListViewItem^>^ test = gcnew System::Collections::Generic::List<ListViewItem^>;
		listview1->Items->Clear();
		System::IO::DirectoryInfo^ info = gcnew System::IO::DirectoryInfo(root);
		array<System::IO::FileInfo^>^ file_array = info->GetFiles();
		System::Collections::IEnumerator^ durchlaeufe = file_array->GetEnumerator();
		int zaehler = 0;
		int i = 0;
		zaehler = info->GetFiles()->Length;
		if(zaehler != 0 )
		{
			while(durchlaeufe->MoveNext())
			{
				ListViewItem^temp = gcnew ListViewItem();
				temp->Text = file_array[i]->Name->ToString();
				temp->SubItems->Add(file_array[i]->CreationTime.Date.ToLongDateString());
				test->Add(temp);
				i++;
			}
			listview1->Items->AddRange(test->ToArray());	
		}
	}
	catch(System::UnauthorizedAccessException^ e)
	{
		MessageBox::Show(e->Message);
		listview1->Items->Clear();
	}	
}
Wieso ich die Daten vorher in eine List schmeisse , es macht das ganze etas schneller die Listview baut sich schneller auf sobald sie die Daten hat. Aber irgendwas muss da komplett im argen sein.Hilfe wäre nett.
Nachtrag ich rufe die Funktion 2 mal auf einmal mit Lokalenlaufwerken und einmal mit UNC Pfad ich merke auf einer Maschine schon den Unterschied. Wenn ich es im Netzwerk mache wird es schlimmer. Liegts an meinem Code oben oder was mag es sein?Hier der Aufruf links ist Lokal Rechts für UNC Pfad
Code:
private: System::Void trwFileExplorer_BeforeExpand_left(System::Object^  sender, System::Windows::Forms::TreeViewEventArgs^ e)
				  {
					  if(e->Node->Nodes[0]->Text == "")
					  {
						  System::Windows::Forms::TreeNode^ node = verbindung.verzeichnisse(e->Node);
					  }
					  e->Node->SelectedImageIndex = 3;
					 
					  verbindung.dateien_ermmitteln(listView1,e->Node->FullPath->ToString());
				  }
private: System::Void trwFileExplorer_BeforeExpand_right(System::Object^  sender, System::Windows::Forms::TreeViewEventArgs^ e)
				  {
					  if(e->Node->Nodes[0]->Text == "")
					  {
						  System::Windows::Forms::TreeNode^ node = verbindung.verzeichnisse(e->Node);
					  }
					  e->Node->SelectedImageIndex = 3;
					 
					  verbindung.dateien_ermmitteln(listView2,e->Node->FullPath->ToString());
				  }
MfG Oli
 
Zuletzt bearbeitet:
schonmal geprüft ob nicht durch dateien_ermitteln im BeforeExpand Ereignis ev. das Ereignis erneut geschmissen wird durch hinzufügen der neuen Nodes?


Ansonsten, kenne mich mit dem managed C++ nicht aus, aber warum verwendest du nicht direkt foreach und gehst komplizierten Weg über Enumerator (sieht mir so aus als wenn dus vom Reflector abgeschaut hast, was der Compiler ausm foreach macht).

Was auch helfen könnte wäre auf for schleife umzusteigen. Intern macht foreach auch nixs anderes, aber du ersparst dir Funktionionsaufrufe (die internen Enumerationsmethoden und glaube implizites casten).

Vereinfacht ungefähr so:
C#:
for(int i = 0; i< zaehler; i++)
{
     FileInfo meineDatei = file_array[i];
     ...
     temp.Text = meineDatei.Name;
     ...
     test.Add(temp);
}

Ansonsten System.Diagnostics.Stopwatch damit kannst du stoppen wie lange einzelne Programmabschnitte brauchen, und ev. einzelne Programmteile kurz auskommentieren um das Verhalten zu testen.
 
foreach habe ich in c++ nicht darum enumerator macht vom Prinzip nix anderes als die foreach soweit ich weiß.Ich hatte eine for schleife das war noch lansamer.Aber der erste Tipp den muss ich mal verfolgen. Aber wie kann ich das testen ?
MfG
Oli
 
Am billigsten einfach Breakpoint setzten und schauen ob er erneut reinspringt.

Zum foreach komisch, sicher, laut google müsste es "for each", also mit Leerzeichen.

Und ist for wirklich langsamer oder war es langsamer wegen der internen GetFiles Prüfung?
Denn eigentlich macht foreach intern auch nixs anderen.
 
Mit Breakpoints habe ich ich schon getestet da ist mir nichts aufgefallen . Ja kann auch for each heissen ;-) benutze es ja nicht. Doch ist schneller so steht es auch in meinem Buch. In c# ist die for each ja auch schneller. Ich hba ekeien Ahnung mehr wieso das so slow ist.
Da smit der Zeit habe ich noch nie gemacht! Ich werde jetzt erstmal schalfen gehen habe mir meinen Code gerad zerschossen und mahce morgen weiter.
Wenn noch wer irgendeien Denkanstoß hat mit Beispiel her damit. Danke im Vorraus.
Gruß
Oli
 
Hallo
So Tests ergaben meien Funktion ist es nicht die da was falsch macht.
Es ist abhängig wieviele Dateien in dem Ordner sind über UNC Pfad. Ab 1000 wird es langsam. Nicjt die Größe der Dateien entscheidet, ein Ordner mit 5000 1kb Dateien ist mit der Aufrufnotation c:\testordner sehr fix .Mit dem Aufruf \\Pc\testordner nur noch langsam. Der gleiche Test mit 10 Dateien und einem gesamt Volumen von 100GB ist der Aufruf bei beiden gleich schnell. Wo nun liegt aber das Problem einer Listview mit einem String UNC Pfad? Google hat mir da nicht geholfen. Jemad eine Idee?

Mfg
Oli
 
Zuletzt bearbeitet:
Ok habe die Lösung wohl ,es liegt schlichtweg an der Listview eine Gridview ist 100mal schneller . Habe es getestet mit stopwatch. Und auch andere bestätigen dies. Da sgilt aber nicht für die Listview C# wpf diese ist wiederum schneller. Wieso die Listview langsamer wird beim unc Pfad habe ich nicht herausgefunden aber es ist egal habe die Ansicht auf 100 beschränkt und so mit eine gute Performance
 
Zurück