Wow! The same code that requires 1.2 seconds on my machine requires 43 seconds on your machine? Are you running an x86 emulator on a 68030? :-)
I added the BeginUpdate & EndUpdate calls and the average time to load (without referencing the Message property on EventLogEntry) is about 1 second. I then thought that it might be related to my code originally being called from the Load event of the form, so I changed it to be called from button.click handler and the times changed slightly: Without BeginUpdate/EndUpdate: 1.4 seconds With BeginUpdate/EndUpdate: 1 second Very odd. I'd love to know what the discrepancy is between our machines... Seang -----Original Message----- From: Walt Ritscher [mailto:[EMAIL PROTECTED]] Sent: Friday, May 31, 2002 2:04 PM To: [EMAIL PROTECTED] Subject: Re: [DOTNET] Eventlog Viewer The Listview control adds some overhead to the process also. Make a call to Listview1.BeginUpdate before adding items. Then call Listview1.EndUpdate after you are done. I tested Sean's code on our network. Before adding the BeginUpdate call the code tested at 43 seconds (local machine). After adding the calls to BegingUpdate and EndUpdate the time dropped to 3.2 seconds. Walt Ritscher -----Original Message----- From: dotnet discussion [mailto:[EMAIL PROTECTED]] On Behalf Of Sean Greer (SBI-Chico) Sent: Friday, May 31, 2002 12:30 PM To: [EMAIL PROTECTED] Subject: Re: [DOTNET] Eventlog Viewer I made some changes to the code that you posted and running against a remote workstation with 1100 entries it takes 1.2 seconds to populate the listview (100 Mbps, dual 1.2 GHz Athlon). If I fetch the Message property, the time goes up to ~ 5 seconds. One of the things that I notice is that you're calling ToString() on properties that are already strings and on enums that should be compared against their native types. The cost of the method call is not zero, so skip calling ToString on the Source property. Also, I would defer fetching the Message until the user selects the event. This would mean keeping the log open (which I'm not doing). Anyway, hope it helps... Seang Here is the reworked code: private void LoadEventLog() { try { DateTime dtStart = DateTime.Now; using(EventLog log = new EventLog("Application", "david")) { // let's get these as strings one time only string sError = EventLogEntryType.Error.ToString(); string sWarn = EventLogEntryType.Warning.ToString(); string sFailureAudit = EventLogEntryType.FailureAudit.ToString(); string sInfo = EventLogEntryType.Information.ToString(); string sSuccessAudit = EventLogEntryType.SuccessAudit.ToString(); StringBuilder sb = new StringBuilder(128); int nCount = log.Entries.Count; for(int i = 0; i < nCount; i++) { EventLogEntry ele = log.Entries[i]; switch(ele.EntryType) { case EventLogEntryType.Error: sb.Append(sError); break; case EventLogEntryType.Warning: sb.Append(sWarn); break; case EventLogEntryType.FailureAudit: sb.Append(sFailureAudit); break; case EventLogEntryType.Information: sb.Append(sInfo); break; case EventLogEntryType.SuccessAudit: sb.Append(sSuccessAudit); break; } sb.AppendFormat(" {0} {1} {2} ({3}) {4} {5} {6}", ele.TimeWritten.ToShortDateString(), ele.TimeWritten.ToShortTimeString(), ele.Source, ele.CategoryNumber, ele.EventID, ele.UserName, ele.MachineName); ListViewItem lvi = new ListViewItem(); lvi.Text = sb.ToString(); lvi.Tag = i; m_List.Items.Add(lvi); sb.Length = 0; } TimeSpan ts = DateTime.Now - dtStart; MessageBox.Show(this, string.Format("Time to dump {0} events = {1} ms.", log.Entries.Count, ts.TotalMilliseconds)); log.Close(); } } catch(Exception ex) { Debug.Assert(false, ex.ToString()); } } You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com. You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com. You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com.