Laden...

Performance bzw. Codeoptimierung(en)

Letzter Beitrag vor 18 Jahren 4 Posts 1.331 Views
Performance bzw. Codeoptimierung(en)

Hallo und schönen Nachmittag zusammen!

Ich habe folgenden Code um alle CD-Covers in einem bestimmten Verzeichnis, also Front und Back auszulesen:


				// read all files from the selected cover directory
				dir = new DirectoryInfo(@"" + txtCoverDir.Text + "");
				imgFiles = dir.GetFiles("*.jpg");

				stbPnlAction.Text = "Reading images file(s)";
				if (imgFiles.Length > 0)
				{
					coverArray = new Hashtable();
					
					stopWatch = new MAStopwatch();
					stopWatch.Start();

					foreach (FileInfo f in imgFiles)
					{	
						fileName = f.Name;
						albumName = fileName;
						
						Image coverImage = Image.FromFile(txtCoverDir.Text + "/" + fileName);
												
						// cut off the extension
						if (albumName.IndexOf(".jpg") > 0)
						{
							albumName = albumName.Substring(0, albumName.IndexOf(".jpg"));
						}
						// cut (back)
						if (albumName.IndexOf("(Back)") > 0) 
						{
							albumName = albumName.Substring(0, albumName.IndexOf("(Back)"));
						}
						// cut (front)
						if (albumName.IndexOf("(Front)") > 0) 
						{
							albumName = albumName.Substring(0, albumName.IndexOf("(Front)"));
						}
						albumName = albumName.Trim();
						
						// cover not found yet
						if (!coverArray.ContainsKey(albumName))
						{
							coverArray.Add(albumName, new Album(albumName,
								fileName, coverImage.Width, coverImage.Height));
						}
						else 
						{
							Album tmpAlbum = (Album)coverArray[albumName];
							tmpAlbum.AddCover(fileName, coverImage.Width, coverImage.Height);
						}
						stbPnlCover.Text = albumName; 
						
						milliSeconds = stopWatch.Elapsed.Milliseconds;
						if (milliSeconds > 999)
						{
							milliSeconds = milliSeconds - 1000;
						}
						stbPnlTime.Text = stopWatch.Elapsed.Seconds.ToString() + "s " + 
							milliSeconds.ToString().PadLeft(3, '0') + "ms";
						Application.DoEvents();

						//coverImage.Dispose();
					}
					stopWatch.Stop();
			        }

Irgendwie ist das Ganze ziemlich langsam und dauert bei ca. 900 Dateien über 40 Sekunden. Da ich das nicht ganz glauben kann wollte ich euch fragen, ob es eventuell schnellere Methoden gibt um alle Dateien eines Verzeichnisses auszulesen bzw. ein Image zu erzeugen (um auf die Breite und Höhe des Covers schliessen zu können)

DANKE
atmosfear

Hallo atmosfear,

durch Image.FromFile wird das Bild komplett eingelesen und dekodiert. Je nachdem, wie große die einzelnen Dateien sind, sind gut 20 Dateien pro Sekunde einzulesen, ein durchaus üblicher Schnitt.

Wenn du es schneller haben willst, darfst du nur den Header der Bilder lesen. Dafür gibt es aber m.E. keine vorgefertigte .NET-Klasse/Methode. Vielleicht gibt es auf www.codeproject.com was. Wenn die Dateien ohnehin klein sind, wird das aber auch nach dieser Änderung nicht schwupps gehen.

Siehe auch: How can my program extract image dimensions from a JPEG file?

herbivore

Du könntest die thumbnails auslesen, die in der versteckten
thumbs.db verwaltet werden.
Dazu gibt es eine Lib:

http://www.petedavis.net/MySite/DynPageView.aspx?pageid=31

http://weblogs.asp.net/justin_rogers/articles/131704.aspx

mfg, meli

Gernot Melichar

Vielen Dank euch beiden und einen schönen Abend!

atmosfear