散分&提问. 这段代码的效率很低,能不能优化下? 还是c# .net 的效率本身就提高不了?

flyingfz 2008-09-28 11:53:58
我原来是做asp.net的,最近心血来潮,想玩玩 WinForm ,就试验着写了个模仿系统的事件查看器的程序,但运行的时候,如果数据量大点,就会很慢,但是系统的事件查看器一点也不慢,内存占用也不多,所以怀疑是我的代码的效率很低,请大家看看能不能改改.
代码如下:


using.........
using System.Diagnostics;

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//treeView的事件绑定.
treeView1.AfterSelect += new TreeViewEventHandler(treeView1_AfterSelect);
}

//当选中某个日志的时候,绑定该日志的数据
void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//得到选中节点的 类别名字
string logName = e.Node.Text;
foreach (EventLog thelog in EventLog.GetEventLogs())
{ //如果选中的名字和当前日志中的名字一样
if (thelog.Log == logName)
{
listView1.Items.Clear();
ColumnHeader header2 = new ColumnHeader();
header2.Text = "消息";
header2.Width = 500;
ColumnHeader header3 = new ColumnHeader();
header3.Text = "来源";
header3.Width = 60;
ColumnHeader header4 = new ColumnHeader();
header4.Text = "时间";
listView1.GridLines = true;
header4.Width = 120;
//添加ListView的头.
listView1.Columns.Add(header2);
listView1.Columns.Add(header3);
listView1.Columns.Add(header4);
//添加每一行数据.
foreach (EventLogEntry entry in thelog.Entries)
{
string[] text = { entry.Message, entry.Source, entry.TimeGenerated.ToString() };
listView1.Items.Add(new ListViewItem(text));
}
}
}
}

private void Form1_Load(object sender, EventArgs e)
{
//添加TreeView的节点.
TreeNode node = new TreeNode(Environment.MachineName);

foreach (EventLog log in EventLog.GetEventLogs())
{
TreeNode subnode = new TreeNode(log.Log);
node.Nodes.Add(subnode);
}
treeView1.Nodes.Add(node);

}
}
请大家指教,多谢了 :)



...全文
251 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingfz 2008-10-06
  • 打赏
  • 举报
回复
呵呵,多谢后面两位朋友的回帖.
yeahspyme 2008-09-28
  • 打赏
  • 举报
回复
有必要先测算一下各层循环都花费了多长时间找出性能瓶颈然后再考虑如何优化
diffmaker 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Red_angelX 的回复:]
1. 效率低下的不是.net 是.net封装了几百层的控件
2. 可以采取延迟加载方式提高速度,进去只显示大节点,点击在读取小节点 时间分开来就显得快很多了
[/Quote]

支持
Red_angelX 2008-09-28
  • 打赏
  • 举报
回复
.net本身处理数据运算比c/c++只慢一点点 慢的在UI层
flyingfz 2008-09-28
  • 打赏
  • 举报
回复
我感觉 性能最差的部分应该在

//添加每一行数据.
foreach (EventLogEntry entry in thelog.Entries)
{
string[] text = { entry.Message, entry.Source, entry.TimeGenerated.ToString() };
listView1.Items.Add(new ListViewItem(text));
}



EventLog.GetEventLogs() 性能再差,也只会循环4次,影响不会很大.当然,会有影响.
Red_angelX 2008-09-28
  • 打赏
  • 举报
回复
1. 效率低下的不是.net 是.net封装了几百层的控件
2. 可以采取延迟加载方式提高速度,进去只显示大节点,点击在读取小节点 时间分开来就显得快很多了
paulin 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 diandian82 的回复:]
foreach (EventLog thelog in EventLog.GetEventLogs())
这句话会不会导致EventLog.GetEventLogs()执行多次?我没有研究过这个。

如果数据量大的话,不太好优化。
[/Quote]
也只是对这个觉得不妥,EventLog.GetEventLogs()拿出来会好些,其它并无问题
mjjzg 2008-09-28
  • 打赏
  • 举报
回复
帮你顶一下吧,留给后来人看有更好的办法没有
个人认为很好了,不错,要我写,差不多也是如此的写法和想法,变慢主要就是那foreach的循环判断
twtetg 2008-09-28
  • 打赏
  • 举报
回复
学习了
ngzsq17 2008-09-28
  • 打赏
  • 举报
回复
支持一下~呵呵~!
abcyzq 2008-09-28
  • 打赏
  • 举报
回复
帮顶,再接分。
leecopper 2008-09-28
  • 打赏
  • 举报
回复
帮顶
fangsp 2008-09-28
  • 打赏
  • 举报
回复
帮顶一个
JeffChung 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 diandian82 的回复:]
foreach (EventLog thelog in EventLog.GetEventLogs())
这句话会不会导致EventLog.GetEventLogs()执行多次?我没有研究过这个。

如果数据量大的话,不太好优化。
[/Quote]

我印象中是会的,所以一般我会把函数执行的结果拿出来,再去做循环
NowtAngell 2008-09-28
  • 打赏
  • 举报
回复
为什么慢..其实还有个问题..
你的程序不是用线程控制的吧.自己写的话就比较好办了
把它做为后台线程就可以搞定的.
默认是同步线程.
fellowcheng 2008-09-28
  • 打赏
  • 举报
回复
foreach (EventLog thelog in EventLog.GetEventLogs())
调用EventLog是跨程序域的,肯定慢
NowtAngell 2008-09-28
  • 打赏
  • 举报
回复
提高性能,简便方法..
System.Diagnostics.Process.Start("*.exe");
我相信你这个程序不会就只有上面一部分吧
ojekleen 2008-09-28
  • 打赏
  • 举报
回复
按集合的特性,基本只能这样。

慢的话有没有其他可能?
diandian82 2008-09-28
  • 打赏
  • 举报
回复
foreach (EventLog thelog in EventLog.GetEventLogs())
这句话会不会导致EventLog.GetEventLogs()执行多次?我没有研究过这个。

如果数据量大的话,不太好优化。
spark_cao 2008-09-28
  • 打赏
  • 举报
回复
个人认为:
自己写的程序肯定要比系统自带的事件查看器运行要慢的
楼主代码写的挺好的
加载更多回复(25)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧