日期:2014-05-18  浏览次数:20743 次

项目中的实际问题,麻烦大大能不能帮忙优化下~~~
应为关系到公司的极目,恕不放出具体代码了
项目的主要目的是从其他来源提供的.DBF文件(对方是手写的,无法用其他工具打开,只能用二进制流读取)中将数据读出后按照我们需要的格式写入分类.TXT文件中,
数据纪录固定2000行,每行的长度相同,数据总起始点相同.文件更新频率为1分钟20次,平均3秒1次,间隔不固定.文件大小在1M左右
现在DEMO写出来了,运行正常,目的也达到了,可是存在下面的问题
方法1:从文件中循环读取每条纪录,格式化,写入想对应的.TXT,线程休眠(Thread.Sleep(1);)继续;
问题:CPU占用50%上下,但是整个处理过程完成需要大概6~7秒;格式化所用的语句已经精简到最低限度
方法2:监控.DBF,当文件最后修噶日期变动时抛出线程,做个上面一样的事;
问题:一样的问题,处理时间过长,造成数据丢失.而且,当有多条线呈并存时会出现文件写冲突
方法3:做的事同1,不进行休眠
问题,处理时间虽然缩短了(2秒上下),但是CPU占用撑顶....

老板看了DEMO命令必须要把CPU占用压缩到30%以下~~~个位大大有没有什么好的优化方案啊~~~~
Thread.Sleep是肯定用不了了....T-T`~~~~

------解决方案--------------------
1:不要使用线程的Sleep,因为 这个方法会导致线程的切换,而造成实际的延时大于你指定的1ms,可以使用:
C# code
Thread.SpinWait(1000);  //这个数字可以自己调整,它大体类似于执行:
for(int i=0;i<1000;i++)
{
   //
}

------解决方案--------------------
感觉你的程序IO为主,逻辑也不会超级复杂,不应该占用这么多CPU,估计还是代码有问题,因为涉及字符串处理,突然想到以前有人提过字符串处理很慢的问题,主要问题是C#中经常变化的字符串要用stringbuilder,不要用string,不知道你是不是也有这个问题,动态变化频繁的字符串,使用string和stringbuilder会有非常大的效率差别。
------解决方案--------------------
1、字符串分析处理问题。用比较好的分析处理算法,至少应该用StringBuilder。
2、写入数据的时候不要用线程,合理处理好IO方面的操作。
------解决方案--------------------
关于这种定时任务我用开源的quartz.net框架来做效率都还好,还没仔细看过源码,自己做的时候各种资源都占用的比较多。
------解决方案--------------------
看起来时间主要耗费在格式化上面了,否则CPU不可能占用那么多。
从循环次数来看,每次格式化花的时间太多,必须在这方面花功夫。把格式化的输入、输出要求晒出来看看。
------解决方案--------------------
MSDN里边关于String有如下说明:
String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。如果需要修改字符串对象的实际内容,请使用 System.Text.StringBuilder 类。


------解决方案--------------------
学习
------解决方案--------------------
不要用sheep,可以用Join

另外sheep(1)会导致线程的切换的说法.我有些不赞同,如果是sheep(0)的话.可能会切换

而且sheep(n)这个n在实际的执行中可能不会是你想要的n,可能时间会长
总之用去sheep(n)方法的程序设计也是什么好设计,可以说是个比较烂的设计

改成join试一下吧.

------解决方案--------------------
总之用sheep(n)方法的程序设计不是什么好设计,可以说是个比较烂的设计
------解决方案--------------------
引用楼主 lokiice 的帖子:
方法1:从文件中循环读取每条纪录,格式化,写入想对应的.TXT,线程休眠(Thread.Sleep(1);)继续;
问题:CPU占用50%上下,但是整个处理过程完成需要大概6~7秒;格式化所用的语句已经精简到最低限度

------解决方案--------------------
没有关注过这些问题
学习中

------解决方案--------------------
觉的和sleep没有直接关系,你的代码有问题
我sleep做的一个WINFORM,几百个线程同时运行都用到sleep也没遇到你说的问题。
sleep等待线程的时候只占内存CUP占用为0
------解决方案--------------------
我的也是分析txt文件,cup占用的多少和sleep大小有关系,间隔越小约占CPU
合理设置sleep的值就能将CPU降低到你想要的程度。
另外和这个StringBuilder没直接关系,StringBuilder并不能有效提高多少效率

楼主好好看看你写的代码吧还是