一个数据解析程序(固定格式ascii编码文本,无分断标记,完全靠字长解析,每记录固定字长)
每记录不等长30字段,文件记录数量3000,更新频率5s(内容不一定更新),程序解析流程(更新延时)必须在2s以下现在程序逻辑已经按要求完全实现了,不过CPU占用率超过90%.....工程部要求要压制到50%以下,20%以下是理想状态
在优化过程中将程序改称多线程:
线程1.定时间检测(为了任意时间启动都不会造成与数据更新时间的偏差,检测间隔1s),如数据更新(文件MD5值),则按记录长阶段为string[],
foreach为每条记录创建处理线程
处理线程. 按照指定格式,将string 转换成自定义类(包括截断,类型转换,数值计算,异常处理)然后将该对象抛出委托,由委托线程再序列化(生成另外一种的文本格式)写入memcached
可是改成这样的逻辑以后,CPU占用就变成了每5s左右形成一个持续2s左右的90%的峰值有没有什么再优化的办法啊~,sleep还是免了,最小单位是1ms 3000次就是3秒了,已经不符合要求了

解决方案 »

  1.   

    用 FileSystemWatcher 来监视文件的更新, 没有更新就不要动它了, 可以减少次数此外不建议你每条记录都开新线程,否则在线程上的开销比分析工作还要大。此外,可以倒着过来分析文件,仅分析最新的就是,不要管旧的。最后,我觉得分析一个这么小的文件都需要大量的 CPU, 是不是分析的算法太耗资源?
      

  2.   


    确实是解析算法上面的问题,而且是集中在类型转换与固定计算上面的(主要是加减法),我又尝试过利用WCF把解析与程序维持数据的业务分离过,把类型转换也计算模块放到那个程序中,那个程序的CPU就会上60%,如果去处这2个模块CPU占用2%都不到。可是我实在想不出还有什么办法啊~
    30个字段中有25个是数值类型,7个是必须转化为数值型用于计算的,精度关系,5个可以使用float,另外2个必须使用decimal(超过19位,ToString后精度必须到个位)然后存入memcached时又必须按照3种格式进行序列化,又要将这7个数值型数据转换成string类型的操作各做3次,然后还有3次string.Format()的操作。。
      

  3.   

    首先要确定到底式计算量大,还是IO频繁,建议看一个windows性能监视器,看看
      

  4.   


    I/O我知道怎么看,计算量在怎么看呢?
    I/O基本基本是每秒1M上下
      

  5.   

    foreach为每条记录创建处理线程 不要每个记录去起线程
    一般认为线程数是CPU核心数能提高并发效率,但线程数大大多于CPU核心数的时候,效率反而低了
    你25个线程,实际上CPU还是去轮询每个线程。试试100条记录一个线程,开两三个线程到上十个线程,分别测试下效率
    这样提高并发,但是不一定能降低CPU占用
      

  6.   

    本身就是计算集中型的程序,为什么限制 cpu占用?
    感觉如果要降低 cpu占用的话, 肯定要 sleep 了, 你也不要每次循环就 sleep, 可以循环多次sleep一次
    另外要计算下分析算法的效率是否已到极限
    假设单核2G cpu, 2G x 2s x 90% = 3.6G 次的 cpu 运算, 解析 9000 条数据, 一条数据 400k 条指令?
      

  7.   

    另外多线程确实没有必要, 几核心的 cpu 就开几个线程, 否则不会提高运算效率