zoukankan      html  css  js  c++  java
  • 提高程序性能的一个例子

    今天改了程序中的一段代码,分享给大家。

    如何改进性能:
    1.需要我们回头来再次审查已有的代码;
    2.思考在程序运行实际情况中那些地方要执行多次,那些地方很少执行,重点改进关键地方;
    3.变换实现的方法:

    如一段数据库比较的代码:
    开始我这样实现:
          //字段存在标记
       bool bFind;

       //循环读取服务器表中字段
       foreach(DataRow serverRow in structureServer.Tables["Column"].Select("TABLE_NAME='"+tablename+"'"))
       {
        //读取服务器表中字段信息
        ColumnInfo colServer = ColumnInfo.GetColumnInfo( serverRow);

        //重置标记
        bFind = false;

        //循环读取客户端表中字段
        foreach(DataRow clientRow in structureClient.Tables["Column"].Select("TABLE_NAME='"+tablename+"'"))
        {
         //读取客户端表中字段信息
         ColumnInfo colClient = ColumnInfo.GetColumnInfo( clientRow);

        
         if(colServer.ColumnName == colClient.ColumnName)
         {
          //比较名称相同的字段
          if(colServer.Compare(colClient)==false)
          {
           //如果不一样就同步
           colServer.SyncColumn(ref cn,colClient);      
          }
          bFind = true;
          break;
         }
        }
        //没有找到相应的字段,创建字段
        if(bFind==false)
        {
         colServer.SyncColumn(ref cn);
        }

       }


       return true;

    上面程序看起来没什么大问题,可以运行,但是如果表中字段超过500个,性能非常差,几乎需要半小时比较才能完成


    改进后

        //用两个哈希表作比较
       Hashtable htServerRow = new Hashtable();
       Hashtable htClientRow = new Hashtable();

      
       //循环读取服务器表中字段
       foreach(DataRow serverRow in structureServer.Tables["Column"].Select("TABLE_NAME='"+tablename+"'"))
       {
        ColumnInfo colServer = ColumnInfo.GetColumnInfo( serverRow);
        htServerRow.Add(colServer.ColumnName,colServer);
       }

       //循环读取客户端表中字段
       foreach(DataRow clientRow in structureClient.Tables["Column"].Select("TABLE_NAME='"+tablename+"'"))
       {
        ColumnInfo colClient = ColumnInfo.GetColumnInfo( clientRow);
        htClientRow.Add(colClient.ColumnName,colClient);
       }
       //比较
       foreach(string name in htServerRow.Keys)
       {
        if(htClientRow.Contains(name))
        {
         ColumnInfo colServer = ((ColumnInfo)htServerRow[name]);

         ColumnInfo colClient = ((ColumnInfo)htClientRow[name]);

         if(colServer.Compare(colClient)==false)
         {
          colServer.SyncColumn(ref cn,colClient);      
         }
        }
        else
        {
         ((ColumnInfo)htServerRow[name]).SyncColumn(ref cn);
        }
       }

    改进后性能非常好,需要半小时得工作一分钟之内就完成了

      

  • 相关阅读:
    Oracle启动关闭
    Open_stack 有虚拟机端口不通的问题
    关于Oracle归档的一些操作
    电脑无法开机 接通电源后主板有红灯闪烁的问题
    Centos7+python3.6+face-recognition
    电脑无法开机的问题-主板上有红色告警灯闪烁
    关于systemctl
    Vsftp搭建 for centos7
    外星人入侵——安装Pygame
    mysql索引原理详解
  • 原文地址:https://www.cnblogs.com/instinct/p/83212.html
Copyright © 2011-2022 走看看