请教诸位高手,下面的代码速度可否再有优化? Stopwatch sw = new Stopwatch();
output("计算开始...");
sw.Start();
using (StreamReader sr = new StreamReader(tb_filepath.Text))
{
String line;
while ((line = sr.ReadLine()) != null)
{
if (line.IndexOf(tb_keyword.Text) != -1) { count++; };
}
output("字符串出现次数:"+count.ToString());
}
sw.Stop();
decimal micro = sw.Elapsed.Ticks / 10000000m;
output("计算结束");
output("花费时间:"+micro.ToString()+" s");
output("计算开始...");
sw.Start();
using (StreamReader sr = new StreamReader(tb_filepath.Text))
{
String line;
while ((line = sr.ReadLine()) != null)
{
if (line.IndexOf(tb_keyword.Text) != -1) { count++; };
}
output("字符串出现次数:"+count.ToString());
}
sw.Stop();
decimal micro = sw.Elapsed.Ticks / 10000000m;
output("计算结束");
output("花费时间:"+micro.ToString()+" s");
解决方案 »
- 关与if与switch效率问题
- 谁会dataGridView或UltraGrid制作这样的表(2)?
- 有高分 No connection could be made because the target machine actively refused it
- 删除数据时索引超出范围的问题
- 错误 1 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程
- 请教window media player自动隐藏系统条该如何实现?
- 想写一个简单的游戏外挂.但是sendkeys.send的功能无法实现.请大虾进来帮帮我.谢谢.
- 怎么将保存在数据库中一个字段里的XML数据读到XMLDocument或XMLReader中?
- 未处理 System.TypeInitializationException Message=""Medecins.类包.SQL"的类型初始值设定项引发异常
- 菜题急送百分!!!两个窗体A、B。A为启动,上面有一个BUTTON,我想达到的目的是:按一下就运行B
- 在Web窗体中怎样使动态添加的控件显现出来?
- 求解WinForm客户端删除服务器端文件操作。
最好还有C++的程序,我们看一下差别多大
不知道用Unsafe代码有没有用?
用stackalloc语句在堆栈上分配合适大小的(具体大小与具体系统有关)缓冲区(byte数组)
用FileStream打开文件,直接读到缓冲区
在缓冲区中以指针移动位置,判断字符编码
根本不存在box unbox的问题
楼主看一下我的回复
sr.ReadToEnd()
然后在处理...
变量line没必要
循环判断条件改为StreamReader.Peek()不是-1
循环体内直接使用ReadLine().IndexOf
从硬盘灯的情况看,应该是读文件的性能没跟上.试试其它几个读文件的类,或者是流的类.
或者测一下IndexOf方法的性能.
不也是"堕落"到C#了?
尽量把繁琐的事情交给机器处理
而不是把繁琐的事情留给自己//回到楼主的问题
直接调用API
OpenFile()
ReadFile()
分块来读取文件,估计会快一些
的确我偏激了一点...
因为任何事情都不是绝对的,我说的只是绝大多数情况.特别是针对CSDN...
--------------------------------------------------------------------另外,我其实工作内容主要是在UNIX平台下,工作语言C和Shell,但平时我更多用C#.
我同事也是这样,他应该是精通C级别的人,不过他写些小软件也是用C#,没办法,做界面C#太方便了.
还有用unsafe代码,把缓冲区fix住
说一下最新进展吧。感谢“viena(维也纳nn-收回潜望镜,下潜50米)”,但是因为我没有Unsafe代码经验,暂时还没入手,不过肯定是要尝试一下的。我把LINE变量去掉了,速度提升了1-2秒,原来的速度是25秒左右。接下来要感谢的是“y1g1y1(袁飞☆VB诚可贵VB.Net价更高C#心中有二者皆可抛☆) ”,
------tb_keyword.Text 定义一个临时变量这种方法竟然提速一倍!!大约在14秒就完成了查找!
字符串比较,如果用指针,恐怕没我说的那么简单
如runrunrun(做最好的自己)所说,恐怕要用KMP之类的算法进行匹配
if (sr.ReadLine().IndexOf(keyword,StringComparison.Ordinal) != -1) { count++; };
后,低于7秒了!!虽然跟C++的5秒左右仍有区别,但是不大了,谢谢大家奥