zoukankan      html  css  js  c++  java
  • 高性能代码编写原则

    高性能代码编写原则

    本文并非讨论类似哪个语言效率最高等无聊的编程语言之争,也不像《effective c》等讲述某个语言的优化问题,本文只是讨论编程习惯对程序性能的影响。

    如果你是一个农夫,那么给你倚天剑你也只会用来锄地,而且会抱怨效果还没锄头好,如果你是一个高手,即使是摘叶飞花,也可伤敌。所以说什么语言不重要,关键还是看人。

    这里先介绍一个心得,叫做低代价优先返回原则。

    低代价优先返回原则

    对于一段代码,应该优先处理低代价的逻辑,低代价的逻辑包括:

    1.CPU计算,不需要访问网络、io、数据库的逻辑。

    纯CPU计算部分是最快的,应该最优先判断,不通过就直接返回,不再计算后面的网络、io、数据库逻辑。如果纯CPU计算部分的判断不通过,则后续需要用到网络、io、数据库的逻辑部分就可以免除了,这样可以大大减少各种io等待。

    2.失败几率最高的逻辑。

    假如一段代码中,有A->B->C->D->OK, 四个判断阶段,其中D阶段的淘汰率最高,C次之,A、B再次之,那么处理顺序应该改为D->C->A->B->OK,这样在第一个判断阶段就过滤了大量的数据流入第二阶段,减少了非常多无谓的A、B阶段的处理。

    这里举一个例子:

    曾经看到一份代码,先将所有需要计算的数据都统一计算好,然后再进行数据的条件判断,不符合条件则返回,伪代码如下:

    复制代码
    void select(p) {
        a = calA(p);
        b = calB(p);
        c = calC(p);
        d = calD(p);
    
       if (a>0 && b < 0 && c < 100 && d > 5) {
          OK
       } else {
         FAIL
        }
    }
    复制代码

    估计很多人都很乐意写这样的代码,感觉上就是逻辑清晰,计算数据,筛选数据,两个步骤很明晰。特别是在某些框架中,提供的接口还强制约束着必须这样按部就班地实现。

    这个程序在执行某一个大数据量的数据逻辑处理,需要花费3天时间
    将代码改为:

    复制代码
    void select(P) {
        d = calD(p); //d的淘汰率最高
       if (d <= 5) {
            return;
         }
         
         c = calC(p); /// 淘汰率次之
        if (c >= 100) {
             return;
         }
    
         a = calA(p) ;
         if (a <= 0) {
             return;
         }
    
         b = calB(p);
         if (b >=0 ) {
             return;
         }
    
         OK
    }
    复制代码

    改代码后,同样的数据处理,只需要十几分钟就完成了。
    我相信,在你们的项目中,找一找上面那种低效率的代码,肯定不少!

     

    分享基于EF+MVC+Bootstrap的通用后台管理系统及架构

     
      基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块、日志模块、上传缩略图模块、通用配置及服务调用, 提供了OA、CRM、CMS的原型实例,适合快速构建中小型互联网及行业Web系统,且能作为代码实践及参考,欢迎提出意见。
     
     
     
     
    Demo预览 点击在线预览 admin/111111 请勿删数据

     
     
     
     
    Framework 业务无关的底层通用机制及功能
    • Model基类:提供数据传输和底层的最基本的基类及接口
    • DAL底层:基于EF code first,提供Repository泛型方法及写历史日志
    • Untility:通用函数库,基本都全了
    • Web:复写MVC基类,及通用MVC控件

     
     
     
    通用模块Core 核心功能模块,包括缓存管理,配置管理,日志管理,服务管理......
    • 缓存模块:提供对分布式缓存的Provider扩展
    • 配置模块:基于正则的配置管理及CURD机制
    • 日志模块:基于Log4net扩展
    • 服务模块:默认使用引用Bll,可扩张调用Wcf服务,且拦截服务
    • 上传模块:通用upload handler,及缩略图生成方式(按需生成,即时生成,延迟生成)
    • 管道模块:通用HttpModule,用于注入通用功能到各个应用及网站

     
     
     
    应用模块三层架构 提供OA,CMS,CRM系统的原型及DAL,IBLL及BLL实现
    • Account:用户认证,可自己扩张到SSO单点登录
    • Account: 安全验证码实现
    • Account: 轻量级权限系统
    • OA:提供OA里人员,部门管理及分配的场景实例
    • CRM:客户管理系统原型
    • CMS:内容发布系统原型

     
     
      数据层(DAL):
    • 采用Code first POCO方式
    • 提供实体设计:一对一,一对多,多对多,自引用的各种使用场景
     
     
      业务逻辑层(BLL):
    • 实现CURD方法
    • 提供复杂查询场景
    • 提供业务异常抛出
    • 对后端异常进行拦截写日志
    • 对写操作进行写历史,用于追踪
     
     
      IBLL:
    • 服务接口,可扩展用WCF发布BLL作为服务
     
     
     
     
    前端框架及实现 MVC,Bootstrap..........
    • 基于Bootstrap:基于“Metronic  Bootstrap  Theme”模板
    • MVC 4.0:CURD操作基于MVC Model Binder
    • Silverlight 5:OA里组织图OrgChart拖拽操作
    • 封装Context:封装ConfigContext,CacheContext,UserContext,CookieContext..
    • 上传控件:Uploadify使用实例
    • Jquery:除Metronic模板在Assets文件夹,Content文件夹加入需要的Jquery插件
    • 提供富文本编辑器,标签,JS曲线图等实例

     
     
     
     
    源码其部署 
    • 源码下载:http://pan.baidu.com/share/link?shareid=1670954073&uk=1210996191
    • 平台:VS2010+,Sql Server, MVC4,Silverlight5_Tools(可选)
    • 脚本部署:新建右图5个库,并执行源码里的Deploy.sql初始化表和数据
    • 配置更改:更改GMS.Web.AdminConfigDaoConfig.xml下的数据库连接字符串
    • 启动:VS IIS Express或建立IIS对应网站(主网站项目GMS.Web.Admin)
    • 登录:初始化用户名:admin 密码:111111

     
     
     
     
     
     
  • 相关阅读:
    长春理工大学第十四届程序设计竞赛F Successione di Fixoracci——找规律&&水题
    长春理工大学第十四届程序设计竞赛A Rubbish——并查集&&联通块
    长春理工大学第十四届程序设计竞赛D Capture The Flag——哈希&&打表
    2018ccpc吉林 E:THE TOWER——数形结合
    区间第K小——可持久化线段树模板
    牛客练习赛3 贝伦卡斯泰露——队列&&爆搜
    [LeetCode] Find Peak Element
    [LeetCode] Intersection of Two Linked Lists
    C++静态库与动态库
    模板的全特化与偏特化
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3502436.html
Copyright © 2011-2022 走看看