优化_内存优化 - CSDN
  • 程序员的数学-优化理论
  • 数据库优化 - SQL优化

    2019-12-13 10:33:07
    以实际SQL入手,带你一步一步走上SQL优化之路!
    前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。

    判断问题SQL

    判断SQL是否有问题时可以通过两个表象进行判断:

    • 系统级别表象
      • CPU消耗严重
      • IO等待严重
      • 页面响应时间过长
      • 应用的日志出现超时等错误

    可以使用sar命令,top命令查看当前系统状态。

    也可以通过Prometheus、Grafana等监控工具观察系统状态。(感兴趣的可以翻看我之前的文章)640?wx_fmt=png

    • SQL语句表象
      • 冗长
      • 执行时间过长
      • 从全表扫描获取数据
      • 执行计划中的rows、cost很大

    冗长的SQL都好理解,一段SQL太长阅读性肯定会差,而且出现问题的频率肯定会更高。更进一步判断SQL问题就得从执行计划入手,如下所示:640?wx_fmt=png

    执行计划告诉我们本次查询走了全表扫描Type=ALL,rows很大(9950400)基本可以判断这是一段"有味道"的SQL。

    获取问题SQL

    不同数据库有不同的获取方法,以下为目前主流数据库的慢查询SQL获取工具

    • MySQL

      • 慢查询日志
      • 测试工具loadrunner
      • Percona公司的ptquery等工具
    • Oracle

      • AWR报告
      • 测试工具loadrunner等
      • 相关内部视图如v$、$session_wait等
      • GRID CONTROL监控工具
    • 达梦数据库

      • AWR报告
      • 测试工具loadrunner等
      • 达梦性能监控工具(dem)
      • 相关内部视图如v$、$session_wait等

    SQL编写技巧

    SQL编写有以下几个通用的技巧:

    • 合理使用索引

    索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;

    一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况

    • 使用UNION ALL替代UNION

    UNION ALL的执行效率比UNION高,UNION执行时需要排重;UNION需要对数据进行排序

    • 避免select * 写法

    执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。

    • JOIN字段建议建立索引

    一般JOIN字段都提前加上索引

    • 避免复杂SQL语句

    提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理

    • 避免where 1=1写法

    • 避免order by rand()类似写法

    RAND()导致数据列被多次扫描

    SQL优化

    执行计划

    完成SQL优化一定要先读执行计划,执行计划会告诉你哪些地方效率低,哪里可以需要优化。我们以MYSQL为例,看看执行计划是什么。(每个数据库的执行计划都不一样,需要自行了解)explain sql640?wx_fmt=png

    字段 解释
    id 每个被独立执行的操作标识,标识对象被操作的顺序,id值越大,先被执行,如果相同,执行顺序从上到下
    select_type 查询中每个select 字句的类型
    table 被操作的对象名称,通常是表名,但有其他格式
    partitions 匹配的分区信息(对于非分区表值为NULL)
    type 连接操作的类型
    possible_keys 可能用到的索引
    key 优化器实际使用的索引(最重要的列) 从最好到最差的连接类型为consteq_regrefrangeindexALL。当出现ALL时表示当前SQL出现了“坏味道”
    key_len 被优化器选定的索引键长度,单位是字节
    ref 表示本行被操作对象的参照对象,无参照对象为NULL
    rows 查询执行所扫描的元组个数(对于innodb,此值为估计值)
    filtered 条件表上数据被过滤的元组个数百分比
    extra 执行计划的重要补充信息,当此列出现Using filesort , Using temporary 字样时就要小心了,很可能SQL语句需要优化

    接下来我们用一段实际优化案例来说明SQL优化的过程及优化技巧。

    优化案例

    • 表结构

      CREATE TABLE `a`
      (
          `id`          int(11) NOT NULLAUTO_INCREMENT,
          `seller_id`   bigint(20)                                       DEFAULT NULL,
          `seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
          `gmt_create`  varchar(30)                                      DEFAULT NULL,
          PRIMARY KEY (`id`)
      );
      CREATE TABLE `b`
      (
          `id`          int(11) NOT NULLAUTO_INCREMENT,
          `seller_name` varchar(100) DEFAULT NULL,
          `user_id`     varchar(50)  DEFAULT NULL,
          `user_name`   varchar(100) DEFAULT NULL,
          `sales`       bigint(20)   DEFAULT NULL,
          `gmt_create`  varchar(30)  DEFAULT NULL,
          PRIMARY KEY (`id`)
      );
      CREATE TABLE `c`
      (
          `id`         int(11) NOT NULLAUTO_INCREMENT,
          `user_id`    varchar(50)  DEFAULT NULL,
          `order_id`   varchar(100) DEFAULT NULL,
          `state`      bigint(20)   DEFAULT NULL,
          `gmt_create` varchar(30)  DEFAULT NULL,
          PRIMARY KEY (`id`)
      );
      
    • 三张表关联,查询当前用户在当前时间前后10个小时的订单情况,并根据订单创建时间升序排列,具体SQL如下

      select a.seller_id,
             a.seller_name,
             b.user_name,
             c.state
      from a,
           b,
           c
      where a.seller_name = b.seller_name
        and b.user_id = c.user_id
        and c.user_id = 17
        and a.gmt_create
          BETWEEN DATE_ADD(NOW(), INTERVAL – 600 MINUTE)
          AND DATE_ADD(NOW(), INTERVAL 600 MINUTE)
      order by a.gmt_create;
      
    • 查看数据量  

      640?wx_fmt=png

    • 原执行时间640?wx_fmt=png

    • 原执行计划640?wx_fmt=png

    • 初步优化思路

    1. SQL中 where条件字段类型要跟表结构一致,表中user_id 为varchar(50)类型,实际SQL用的int类型,存在隐式转换,也未添加索引。将b和c表user_id 字段改成int类型。
    2. 因存在b表和c表关联,将b和c表user_id创建索引
    3. 因存在a表和b表关联,将a和b表seller_name字段创建索引
    4. 利用复合索引消除临时表和排序

    初步优化SQL

    alter table b modify `user_id` int(10) DEFAULT NULL;
    alter table c modify `user_id` int(10) DEFAULT NULL;
    alter table c add index `idx_user_id`(`user_id`);
    alter table b add index `idx_user_id_sell_name`(`user_id`,`seller_name`);
    alter table a add index `idx_sellname_gmt_sellid`(`gmt_create`,`seller_name`,`seller_id`);
    

    查看优化后执行时间

    640?wx_fmt=png

    查看优化后执行计划640?wx_fmt=png

    查看warnings信息640?wx_fmt=png

    继续优化alter table a modify "gmt_create" datetime DEFAULT NULL;

    查看执行时间

    640?wx_fmt=png

    查看执行计划640?wx_fmt=png

    总结

    1. 查看执行计划 explain
    2. 如果有告警信息,查看告警信息 show warnings;
    3. 查看SQL涉及的表结构和索引信息
    4. 根据执行计划,思考可能的优化点
    5. 按照可能的优化点执行表结构变更、增加索引、SQL改写等操作
    6. 查看优化后的执行时间和执行计划
    7. 如果优化效果不明显,重复第四步操作
     

    系列文章

     
     

    温馨提示

    如果你喜欢本文,请关注我的个人公众号!或者关注我的个人博客www.javadaily.cn

     

     

    展开全文
  • 必装软件 yum -y install gcc glibc gcc-c++ make ... yum -y install setuptool ntsysv system-config-securitylevel-tui NetworkMana...

    最小化安装centos后必要的优化

    1、配置网络及更改计算机名

    改计算机名

    hostnamectl set-hostname pokes

    配置网络

    vi /etc/sysconfig/network-scripts/ifcfg-ens33

    网络配置文件内容编辑如下(有注释的是必须改的):

    TYPE="Ethernet"
    BOOTPROTO="static"    #静态
    DEFROUTE="yes"
    PEERDNS="yes"
    PEERROUTES="yes"
    IPV4_FAILURE_FATAL="no"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    IPV6_DEFROUTE="yes"
    IPV6_PEERDNS="yes"
    IPV6_PEERROUTES="yes"
    IPV6_FAILURE_FATAL="no"
    NAME="eno16777736"
    UUID="0e6ca219-0d2e-4000-8f17-bf7424e46595"
    DEVICE="eno16777736"
    ONBOOT="yes"        #开机开启网卡
    IPADDR=192.168.255.101
    GATEWAY=192.168.255.2
    NETMASK=255.255.255.0
    DNS=114.114.114.114

    2、更改系统源

     

    首先备份源 /ect/yum.repos.d/CentOS-Base.repo,在安装之前我们先必须安装wget

    yum -y install wget yum-utils epel-release
    mv  /etc/yum.repos.d/CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo.bak

    替换为阿里源

    wget -O  /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-7.repo
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    清楚缓存、生成新缓存

    yum clean all && yum makecache

    3、更新系统

    yum -y upgrade

    升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变 (不变内核和设置,升级包和系统版本)

    不建议使用update 

    yum -y update

    升级所有包,改变软件设置和系统设置,系统版本内核都升级

    详细请看这里:https://blog.csdn.net/weixin_34415923/article/details/92598179

    4、安装常用的软件

    yum -y install gcc
    yum -y install glibc 
    yum -y install gcc-c++ 
    yum -y install make 
    yum -y install cmake
    yum -y install net-tools
    yum -y install screen
    yum -y install vim
    yum -y install lrzsz
    yum -y install tree
    yum -y install dos2unix
    yum -y install lsof
    yum -y install tcpdump
    yum -y install bash-completion
    yum -y install wget
    yum -y install ntp
    yum -y install setuptool
    yum -y install psmisc
    yum -y install openssl
    yum -y install openssl-devel
    yum -y install bind-utils
    yum -y install traceroute

    一键安装

    yum -y install gcc glibc gcc-c++ make cmake net-tools screen vim lrzsz tree dos2unix lsof tcpdump bash-completion wget ntp setuptool psmisc openssl openssl-devel bind-utils traceroute
    • gcc  glibc  gcc-c++  make cmake  编译器,编译安装的时候会用到
    • net-tools           #Linux内核中配置网络功能的工具
    • screen              #用于命令行终端切换
    • vim                   #编辑器
    • lrzsz                 #拖动上传,sz下载
    • tree                  #树形目录
    • dos2unix          #Windows格式文件转换为Unix、Linux格式的实用命令
    • lsof                  #列出当前系统打开文件的工具
    • tcpdump          #抓包工具
    • bash-completion     #自动补全功能增强
    • wget                 #文件下载
    • ntp                    #同步网络事件
    • psmisc              #帮助管理/proc目录的程序
    • openssl    openssl-devel         #web安全通信的基石,没有openssl,可以说我们的信息都是在裸奔

    图形化配置网络/服务/防火墙

    • setuptool        #安装setup命令工具

    • ntsysv            #安装setup工具配套的系统服务组件

    • system-config-securitylevel-tui     #安装setup工具配套的防火墙配置组件

    • NetworkManager-tui                    #安装setup工具配套的网络配置组件

    • authconfig-gtk                              #安装setup工具配套的验证配置组件

    • system-config-keyboard              #安装setup工具配套的键盘配置组件

    • bind-utils                                      #解决没有nslookup命令

    yum -y install setuptool
    yum -y install ntsysv
    yum -y install system-config-securitylevel-tui
    yum -y install NetworkManager-tui authconfig-gtk
    yum -y install system-config-keyboard
    yum -y install bind-utils

    一键安装

    yum -y install setuptool ntsysvsystem-config-securitylevel-tui networkManager-tui authconfig-gtk system-config-keyboard bind-utils

    5、关闭防火墙(测试环境)

    systemctl disable firewalld
    systemctl stop firewalld
    sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

    6、添加普通用户并进行sudo授权管理

    7、默认打开vim增加行号

    vim 要默认打开的时候显示行号,这样就可以不用每次编辑的时候在手动在命令模式下:set number 来显示行号。

    具体做法是: 创建一个 .vimrc的配置文件。

    在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:

    $vi ~/.vimrc

    往文件里面添加内容: set number , 保存退出。

    8、更改ssh默认端口

    9、禁止root远程登录 切记给系统添加普通用户,给su到root的权限

    10、root用户密码输入错误三次,锁定账户一段时间

    11、设置时区并同步时间

    12、历史命令显示操作时间

    13、SSH超时时间

    14、禁止定时任务向发送邮件

    sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab

     

    不断更新

     

     

     

    展开全文
  • (1)了解最优化模型。 (2)掌握线性规划的优化求解。 (3)掌握整数规划的优化求解。 (4)了解Matlab的图形化应用。 二、实例演练  1、谈谈你对最优化模型的了解。  最优化模型是数学建模大赛中最常见的...

    一、学习目标

    (1)了解最优化模型。

    (2)掌握线性规划的优化求解。

    (3)掌握整数规划的优化求解。

    (4)了解Matlab的图形化应用。

    二、实例演练

         1、谈谈你对最优化模型的了解。

            最优化模型是数学建模大赛中最常见的问题类型之一。一般说来,凡是寻求最大、最小、最远、最近、最经济、最丰富、最高效、最耗时的目标,都可以划入优化问题的范畴。MATLAB 优化工具箱和全局优化工具箱对多个优化问题提供了完整的解决方案,前者涵盖了线性规划、混合整型线性规划、二次规划、非线性优化、非线性最小二乘的求解器,后者囊括了全局搜索、多初始点、模式搜索、遗传算法等求解算法。

           最优化即在一定的条件下,寻求使目标最小(大)的设计参数或决策。在优化问题中有两个关键对象:目标函数约束条件。哈哈哈,这让笔者想起来高中学到的线性规划,其实,本节谈到的最优化模型跟高中的线性规划还真有点像。不过,高中的线性规划问题约束条件很少,一般是通过作图法来求解。本节的最优化模型约束条件一般比高中的线性规划多很多,并且我们要通过写代码去求解,而不是作图。常规优化问题,其数学表达可以描述为:

    其中x 为长度n的决策变量向量,f(x) 为目标函数,G(x) 为约束函数。

    以上数学表达式看不明白也没关系,因为下面我们会通过两个具体的例子去讲解分析。

    求解目标函数的最小(大)值,一个高效而精确的解决方案不仅取决于约束条件和变量数量,更取决于目标函数和约束函数的特性。明确优化类型是确认优化方案的前提,让我们看一下这些特性如何划分:

    常见的目标函数有:

    线性规划:被广泛的应用于变量之间可线性表示的财务、能源、运营研究等现代管理领域中。

    混合整数线性规划:扩展了线性规划问题,增加了最优解中部分或全部变量必须是整数的约束。例如,如果一个变量代表要认购的股票数量,则只应取整数值。同样,如果一个变量代表发电机的开/关状态,则只应取二进制值(0 或 1)。

    二次规划:目标函数或约束函数为多元二次函数。此优化应用于财务金融中投资组合优化、发电厂发电优化、工程中设计优化等领域。

    最小二乘:分为线性和非线性,通过最小化误差的平方和寻找变量的最优函数匹配。非线性最小二乘优化还可用于曲线拟合。

     

    对 MATLAB 提供的各类优化问题的算法,我们称之为求解器(Solver)。根据其求解目标,被分为四大组:

    • 极小值优化组:找到目标函数出发点 x0 附近的局部极小值

    • 多目标优化组:找到最小化一组函数的最大值或指定的值

    • 方程求解组:找到非线性方程 f(x) = 0 出发点 x0 附近的解

    • 最小二乘法(曲线拟合)组:最小化平方和

    仅优化工具箱就提供了近 20 种求解器,面对如此繁多的选项,用户往往一头雾水。幸好,MATLAB 提供了简单明了的参考工具 —— 优化决策表。可谓一表在手,优化不愁:

    上表中*表示算法由全局工具箱提供。

    我的天呀,你是不是已经被上面的内容吓傻了。看不太懂?没关系。我们现在只需知道有那么一回事即可,不必苦恼。等遇到相应的问题时我们再去结合具体的例子去深入学习和理解。

        2、已知目标函数和约束条件如下,试求解目标函数的最小值。

                                 

           初一看,HPS、PP、EP、P1、I1,……等等,这些是什么东东?别紧张,它们只是变量,把它们当成x,y,z这种常见的变量去看待即可。我数了一下,约束函数中共有19条数学表达式,涉及16个变量。是挺难搞的,用高中的作图法怕是解决不了。别怕,我们有Matlab,通过代码去搞定它。

           好,现在我们开始一步步去求解它。

    a. 首先,根据题目确认这是一个线性规划问题。而线性规划的通用数学表达式和MATLAB标准形式为:

    这个标准形式很重要,上面的A,b,Aeq,beq,lb,ub我们后面要用到。

    b. 对于线性规划的优化求解步骤(也适用于其他优化方案),建议如下:

        1 ) 选择优化求解器

        2 ) 将所有变量合并为一个向量

        3 ) 创建边界约束(lb,ub)

        4 ) 创建线性不等式约束(A,b)

        5 ) 创建线性等式约束(Aeq,beq)

        6 ) 创建目标函数

        7 ) 优化问题求解

        8 ) 结果检验

    上面的求解步骤非常重要,我们的代码整体框架跟求解步骤差不多。

    现在我们按照上面的求解步骤去求解:

    (1)选择优化求解器。

    这道题目是这是一个线性规划问题。求解线性规划问题,我们一般选用linprog。linprog在写代码将要写完才需用到。在第一步我们只需要知道一个线性规划问题,代码按照求解线性规划问题去写即可。

    (2)将所有变量合并为一个向量。

    目标函数和约束条件中共有HPS、PP、EP、P1、I1等16个变量,我们需要将其合并为一个向量。除了合并为一个向量外,我们还将每个变量依次分别赋值1,2,3,4,……16。

    %% 将所有变量合并为一个向量,共16个变量
    variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1','BF2','HPS','MPS','LPS','P1','P2','PP','EP'}
    N = length(variables)
    for v = 1:N
        eval([variables{v},'=',num2str(v),';'])
    end

    (3)创建边界约束(lb,ub)

    lb是指low boundary,即最低边界。ub是指up boundary,即最高边界。在这一步中,我们需要把约束条件里的不等式(该不等式只含单个变量,如2500<=P1<=6250,3000<=P2<=9000)找出来,并根据它们的上下边界写代码。

    %% 设置上下限约束(lb<=x<=ub)
    % 设置下限约束,即lb<=x
    lb = zeros(size(variables)); % 1x16的矩阵,每个数都是0
    lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
    % 设置上限约束,即x<=ub
    ub = Inf(size(variables)); % 1想6的矩阵,每个数都是无穷大
    ub([P1,P2,I1,I2,C,LE2])= [6250,9000,192000,244000,62000,142000];

    (4)创建线性不等式约束(A,b)。

    在这一步需要将约束条件里的不等式(该不等式含两个或两个以上变量)找出来,并根据它们的上下边界写代码。

    %% 创建线性不等式约束(A*x<=b)
    A = zeros(3,16); % 3x16的矩阵,每个数均为0,为什么是3x16,因为约束条件有3个不等式
    % 由不等式I1-HE1<=132000得到下面一行代码
    A(1,I1)=1; A(1,HE1)=-1; b(1) = 132000;
    % 由不等式-EP-PP<=12000得到下面一行代码
    A(2,EP)=-1; A(2,PP)=-1; b(2) = -12000;
    % 由不等式-P1-P2-PP<=-24550得到下面一行代码
    A(3,[P1,P2,PP])=[-1,-1,-1];b(3)=-24550;

    (5)创建线性等式约束(Aeq,beq)。

    在这一步需要把约束条件中的等式找出来,并通过移项,让等式的右边为0。

    %% 创建线性等式约束(Aeq*x=beq)
    Aeq=zeros(8,16);beq=zeros(8,1) % 约束条件中共有8个等式
    % 把等式I2=LE2+HE2转化为LE2+HE2-I2=0后,得到下面一行代码
    Aeq(1,[LE2,HE2,I2])=[1,1,-1];
    Aeq(2,[LE1,LE2,BF2,LPS])=[1,1,1,-1];
    Aeq(3,[I1,I2,BF1,HPS])=[1,1,1,-1];
    Aeq(4,[C,MPS,LPS,HPS])=[1,1,1,-1];
    Aeq(5,[LE1,HE1,C,I1])=[1,1,1,-1];
    Aeq(6,[HE1,HE2,BF1,BF2,MPS])=[1,1,1,-1,-1];
    Aeq(7,[HE1,LE1,C,P1,I1])=[1267.8,1251.4,192,3413,-1359.8];
    Aeq(8,[HE2,LE2,P2,I2])=[1267.8,1251.4,3413,-1359.8];

    (6)创建目标函数。

    %% 创建目标函数
    f = zeros(size(variables));
    % 由目标函数0.002614HPS+0.0239PP+0.009825EP
    f([HPS,PP,EP]) = [0.002614,0.0239,0.009825];

    (7) 求解问题

    %% 由linprog实现线性规划问题求解
    options = optimoptions('linprog','Algorithm','dual-simplex');
    % 将前面已经确定的各个参数传入linprog()中
    [x, fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
    for d=1:N
        fprintf('%12.2f\t%s\n',x(d),variables{d})
    end

    fprintf函数是将求解后每个变量的打印出来。

    求解结果如下:

    下面把完整的源代码贴上:

    clc,clear,close all
    %% 选择优化求解器,线性规划求解可由linprog实现
    
    %% 将所有变量合并为一个向量,共16个变量
    variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1','BF2','HPS','MPS','LPS','P1','P2','PP','EP'}
    N = length(variables)
    for v = 1:N
        eval([variables{v},'=',num2str(v),';'])
    end
    
    %% 设置上下限约束(lb<=x<=ub)
    % 设置下限约束,即lb<=x
    lb = zeros(size(variables)); % 1x16的矩阵,每个数都是0
    lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
    % 设置上限约束,即x<=ub
    ub = Inf(size(variables)); % 1想6的矩阵,每个数都是无穷大
    ub([P1,P2,I1,I2,C,LE2])= [6250,9000,192000,244000,62000,142000];
    
    %% 创建线性不等式约束(A*x<=b)
    A = zeros(3,16); % 3x16的矩阵,每个数均为0,为什么是3x16,因为约束条件有3个不等式
    % 由不等式I1-HE1<=132000得到下面一行代码
    A(1,I1)=1; A(1,HE1)=-1; b(1) = 132000;
    % 由不等式-EP-PP<=12000得到下面一行代码
    A(2,EP)=-1; A(2,PP)=-1; b(2) = -12000;
    % 由不等式-P1-P2-PP<=-24550得到下面一行代码
    A(3,[P1,P2,PP])=[-1,-1,-1];b(3)=-24550;
    
    %% 创建线性等式约束(Aeq*x=beq)
    Aeq=zeros(8,16);beq=zeros(8,1) % 约束条件中共有8个等式
    % 把等式I2=LE2+HE2转化为LE2+HE2-I2=0后,得到下面一行代码
    Aeq(1,[LE2,HE2,I2])=[1,1,-1];
    Aeq(2,[LE1,LE2,BF2,LPS])=[1,1,1,-1];
    Aeq(3,[I1,I2,BF1,HPS])=[1,1,1,-1];
    Aeq(4,[C,MPS,LPS,HPS])=[1,1,1,-1];
    Aeq(5,[LE1,HE1,C,I1])=[1,1,1,-1];
    Aeq(6,[HE1,HE2,BF1,BF2,MPS])=[1,1,1,-1,-1];
    Aeq(7,[HE1,LE1,C,P1,I1])=[1267.8,1251.4,192,3413,-1359.8];
    Aeq(8,[HE2,LE2,P2,I2])=[1267.8,1251.4,3413,-1359.8];
    
    %% 创建目标函数
    f = zeros(size(variables));
    % 由目标函数0.002614HPS+0.0239PP+0.009825EP
    f([HPS,PP,EP]) = [0.002614,0.0239,0.009825];
    
    %% 由linprog实现线性规划问题求解
    options = optimoptions('linprog','Algorithm','dual-simplex');
    % 将前面已经确定的各个参数传入linprog()中
    [x, fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
    for d=1:N
        fprintf('%12.2f\t%s\n',x(d),variables{d})
    end

      3、下面是一个整数规划问题,已知目标函数和约束条件如下,求解目标函数的最大值。

                                          

         求解最大值问题和求解最小值问题本质上是一致的,求解最大值也可以转换为求解最小值。

    例如:本题要求解z=3*x1-2*x2+5*x3的最大值,也就是要求解y=-3*x1+2*x2-5*x3的最小值。求解线性规划最小值问题我们在上面已经学过。本题还有一个比较特殊的问题是,约束条件中的三个变量均为整数,而且是0或1,这也是所谓的0-1规划问题。

    求解整值问题要用到专门的求解器 intlinprog。

    clc,clear,close all
    % 求z=3*x1 - 2*x2 + 5*x3的最大值转化为求y=-3*x1 + 2*x2 - 5*x3的最小值。
    f = [-3;2;-5]; % 创建目标函数
    intcon=[1,2,3];
    A=[1 2 -1; 1 4 1; 1 1 0; 0 4 1]; % 四个不等式中的变量系数
    b=[2;4;3;6]; % 约束条件中不等式右边的常数
    lb=[0,0,0]; % x1,x2,x3=0
    ub=[1,1,1]; % x1,x2,x3=1
    Aeq=[0,0,0];
    beq=0;
    x=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

    我想提一下intcon=[1,2,3]这句代码是怎么回事。

    下面我举一个简单的例子来说明intcon的用法。

    X=[x1,x2,x3,x4,x5,x6],其中x2, x3, x6只能取整数
    intcon = [2,3,6]
    如果所有变量都只能取整数,则:intcon = [1,2,3,4,5,6]; 比较方便的写法是:intcon = 1:6
    如果只有x4取整数,则:intcon = 4;就是约束整形变量

    在本题中,除了x1,x2,x3=0或1外,没有其它的等式了。故Aeq=[0,0,0];beq=0;

     4、图形化应用

    在数学建模竞赛中,我们一般通过代码来进行求解问题,图形化应用可以用来检验结果是否正确。

    MATLAB 在数据分析领域如此受欢迎,除了其提供丰富的内置算法集,还有各类友好的应用界面。在优化工具箱中,也有这么一个强大的工具—— Optimization App,可以在 MATLAB Apps 窗口或者运行 optmitool 命令打开。它是一个交互式的图形化应用工具,无需手写代码,直接在图形界面中设置各类求解器、配置目标函数、约束条件,即可运行优化算法并使中间结果和最终结果可视化。

    在 Optimization App 中,只需点击菜单栏中的 File > Generate Code,即可将 App 中的各项设置自动生成 MATLAB 代码,用户可实现算法的复用和二次开发。

    展开全文
  • Windows10必做的优化

    2018-07-26 17:04:03
    (2017年9月28日更新)Win10在经过几个大版本迭代更新后,目前(创意者更新)已非常稳定,几乎没有需要优化的地方,请普通用户直接使用即可。 工具/原料 Windows10操作系统 电脑 关闭家庭组 (2018年5月...

     有些人升级win10后发现,win10并没想象中顺畅,反而很占资源。其实,只需做一些小调整就能大幅提高win10效率。

    (2017年9月28日更新)Win10在经过几个大版本迭代更新后,目前(创意者更新)已非常稳定,几乎没有需要优化的地方,请普通用户直接使用即可。

    工具/原料

    • Windows10操作系统

    • 电脑

    关闭家庭组

    (2018年5月10日更新)目前的Win10最新版(版本号1803,四月更新)中家庭组功能已被砍掉。 

    (1)右键点击“此电脑”,选择“管理”,进入“计算机管理”窗口。

    (2)在左侧的菜单选择“服务”,并在右侧找到“HomeGroup Listener”和“HomeGroup Provider”两个服务。

    (3)右键点击它,选择“属性”,并在新打开的窗口中把启动类型改为“禁用”。

    (5)这样,就关闭了“家庭组”功能。win8时代就有的家庭组功能会不断读写硬盘,造成硬盘占用高,这个问题在win10中依然存在。关闭这个功能会使硬盘占用大幅降低,不再出现动不动就占用100%的情况。(可在任务管理器中查看)

    卸载无用应用

    打开开始菜单里的“设置”应用,依次进入“系统”→“应用和功能”,可以卸掉一些您用不到的系统自带应用。

    设置里还有许多可以调整的地方,您可以自行探索。

    关闭优化驱动器

    (1)双击“此电脑”打开,右键点击任意磁盘,选择“属性”。

    (2)在上方的标签选择“工具”,然后点击“优化”。

    (3)在下方“已计划的优化”处点“更改设置”,然后取消计划。

    (4)win10的“优化驱动器”即win7时代的磁盘碎片整理,每两三个月做一次即可,每周计划运行实属磨损硬盘。

    关闭IPV6服务

    如果您的网络运营商不分配IPV6地址,可以将其关闭。

    (1)右键点击“此电脑”,选择“管理”,进入“计算机管理”窗口。在左侧的菜单选择“服务”,并在右侧找到“IPHelper”。右键点击它,选择“属性”,并在新打开的窗口中把启动类型改为“禁用”。方法基本同第一部分。

    关闭用户账户控制(UAC)(不推荐)

    用户账户控制是从Vista时代就产生的功能,用来拦截可能危害系统的操作,但一定程度上会骚扰用户,所以可以选择关掉它。

    (1)打开控制面板,选择“用户账户”。

    (2)在用户账户中,选择“更改用户账户控制设置”,在打开的新窗口中把滑块拉到底并确定。

    使用优化软件

    一些软件,例如XX安全卫士,XX电脑管家,XX魔方等有启动项和服务优化功能,可根据情况使用。

    【 哈哈,问题解决了,领个支付宝红包 。支付宝首页搜索“519449706”领大额现金红包】

     

     

    展开全文
  • 前端优化是复杂的,针对方方面面的资源都有不同的方式。那么,前端优化的目的是什么 ?  1. 从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。  2. 从服务商...

    前言:关于优化问题,随着项目经验不断累积,多方查找资料进行拼接合并,形成如下文章,之后遇到类似好的方法,会不断补充完善。

    前端是庞大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各种各样的资源。前端优化是复杂的,针对方方面面的资源都有不同的方式。那么,前端优化的目的是什么 ?

    1. 从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。
    2. 从服务商角度而言,优化能够减少页面请求数、或者减小请求所占带宽,能够节省可观的资源。
    总之,恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用。

    大概有如下优化方法:



      具体参考:http://www.cnblogs.com/developersupport/p/webpage-performance-best-practices.html
      一、页面级优化
      1. 减少 HTTP请求数
      这条策略基本上所有前端人都知道,而且也是最重要最有效的。都说要减少 HTTP请求,那请求多了到底会怎么样呢 ?首先,每个请求都是有成本的,既包含时间成本也包含资源成本。一个完整的请求都需要经过 DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据这样一个 “漫长” 而复杂的过程。时间成本就是用户需要看到或者 “感受” 到这个资源是必须要等待这个过程结束的,资源上由于每个请求都需要携带数据,因此每个请求都需要占用带宽。另外,由于浏览器进行并发请求的请求数是有上限的 (具体参见此处 ),因此请求数多了以后,浏览器需要分批进行请求,因此会增加用户的等待时间,会给用户造成站点速度慢这样一个印象,即使可能用户能看到的第一屏的资源都已经请求完了,但是浏览器的进度条会一直存在。
      减少 HTTP请求数的主要途径包括:
      (1). 从设计实现层面简化页面
      如果你的页面像百度首页一样简单,那么接下来的规则基本上都用不着了。保持页面简洁、减少资源的使用时最直接的。如果不是这样,你的页面需要华丽的皮肤,则继续阅读下面的内容。
      (2). 合理设置 HTTP缓存
      缓存的力量是强大的,恰当的缓存设置可以大大的减少 HTTP请求。以有啊首页为例,当浏览器没有缓存的时候访问一共会发出 78个请求,共 600多 K数据 (如图 1.1),而当第二次访问即浏览器已缓存之后访问则仅有 10个请求,共 20多 K数据 (如图 1.2)。 (这里需要说明的是,如果直接 F5刷新页面的话效果是不一样的,这种情况下请求数还是一样,不过被缓存资源的请求服务器是 304响应,只有 Header没有Body ,可以节省带宽 )
      怎样才算合理设置 ?原则很简单,能缓存越多越好,能缓存越久越好。例如,很少变化的图片资源可以直接通过 HTTP Header中的Expires设置一个很长的过期头 ;变化不频繁而又可能会变的资源可以使用 Last-Modifed来做请求验证。尽可能的让资源能够在缓存中待得更久。关于 HTTP缓存的具体设置和原理此处就不再详述了,有兴趣的可以参考下列文章:
    HTTP1.1协议中关于缓存策略的描述
    Fiddler HTTP Performance中关于缓存的介绍
      (3). 资源合并与压缩
      如果可以的话,尽可能的将外部的脚本、样式进行合并,多个合为一个。另外, CSS、 Javascript、Image 都可以用相应的工具进行压缩,压缩后往往能省下不少空间。
      (4). CSS Sprites
      合并 CSS图片,减少请求数的又一个好办法。
      (5). Inline Images

      使用 data: URL scheme的方式将图片嵌入到页面或 CSS中,如果不考虑资源管理上的问题的话,不失为一个好办法。如果是嵌入页面的话换来的是增大了页面的体积,而且无法利用浏览器缓存。使用在 CSS中的图片则更为理想一些。

    .sample-inline-png {
        padding-left: 20px;
        background: white url('data:image/png;base64,iVBORw0KGgoAA
    AANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0l
    EQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6
    P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC') no-repeat scroll left top;
    }
      (6). Lazy Load Images(自己对这一块的内容还是不了解)
      这条策略实际上并不一定能减少 HTTP请求数,但是却能在某些条件下或者页面刚加载时减少 HTTP请求数。对于图片而言,在页面刚加载的时候可以只加载第一屏,当用户继续往后滚屏的时候才加载后续的图片。这样一来,假如用户只对第一屏的内容感兴趣时,那剩余的图片请求就都节省了。 有啊首页 曾经的做法是在加载的时候把第一屏之后的图片地址缓存在 Textarea标签中,待用户往下滚屏的时候才 “惰性” 加载。

      2. 将外部脚本置底(将脚本内容在页面信息内容加载后再加载)
      前文有谈到,浏览器是可以并发请求的,这一特点使得其能够更快的加载资源,然而外链脚本在加载时却会阻塞其他资源,例如在脚本加载完成之前,它后面的图片、样式以及其他脚本都处于阻塞状态,直到脚本加载完成后才会开始加载。如果将脚本放在比较靠前的位置,则会影响整个页面的加载速度从而影响用户体验。解决这一问题的方法有很多,在 这里有比较详细的介绍 (这里是译文和 更详细的例子 ),而最简单可依赖的方法就是将脚本尽可能的往后挪,减少对并发下载的影响。
      3. 异步执行 inline脚本(其实原理和上面是一样,保证脚本在页面内容后面加载。)
      inline脚本对性能的影响与外部脚本相比,是有过之而无不及。首页,与外部脚本一样, inline脚本在执行的时候一样会阻塞并发请求,除此之外,由于浏览器在页面处理方面是单线程的,当 inline脚本在页面渲染之前执行时,页面的渲染工作则会被推迟。简而言之, inline脚本在执行的时候,页面处于空白状态。鉴于以上两点原因,建议将执行时间较长的 inline脚本异步执行,异步的方式有很多种,例如使用 script元素的defer 属性(存在兼容性问题和其他一些问题,例如不能使用 document.write)、使用setTimeout ,此外,在HTML5中引入了 Web Workers的机制,恰恰可以解决此类问题。

      4. Lazy Load Javascript(只有在需要加载的时候加载,在一般情况下并不加载信息内容。)

      随着 Javascript框架的流行,越来越多的站点也使用起了框架。不过,一个框架往往包括了很多的功能实现,这些功能并不是每一个页面都需要的,如果下载了不需要的脚本则算得上是一种资源浪费 -既浪费了带宽又浪费了执行花费的时间。目前的做法大概有两种,一种是为那些流量特别大的页面专门定制一个专用的 mini版框架,另一种则是 Lazy Load。YUI 则使用了第二种方式,在 YUI的实现中,最初只加载核心模块,其他模块可以等到需要使用的时候才加载。


      5. 将 CSS放在 HEAD中
      如果将 CSS放在其他地方比如 BODY中,则浏览器有可能还未下载和解析到 CSS就已经开始渲染页面了,这就导致页面由无 CSS状态跳转到 CSS状态,用户体验比较糟糕。除此之外,有些浏览器会在 CSS下载完成后才开始渲染页面,如果 CSS放在靠下的位置则会导致浏览器将渲染时间推迟。
      6. 异步请求 Callback(就是将一些行为样式提取出来,慢慢的加载信息的内容)
      在某些页面中可能存在这样一种需求,需要使用 script标签来异步的请求数据。类似:
      Javascript:

    function myCallback(info){ 
    //do something here 

      HTML:

      cb返回的内容 :
    myCallback('Hello world!');
    像以上这种方式直接在页面上写 <script>对页面的性能也是有影响的,即增加了页面首次加载的负担,推迟了 DOMLoaded和window.onload 事件的触发时机。如果时效性允许的话,可以考虑在 DOMLoaded事件触发的时候加载,或者使用 setTimeout方式来灵活的控制加载的时机。
      7. 减少不必要的 HTTP跳转
      对于以目录形式访问的 HTTP链接,很多人都会忽略链接最后是否带 ’/',假如你的服务器对此是区别对待的话,那么你也需要注意,这其中很可能隐藏了 301跳转,增加了多余请求。具体参见下图,其中第一个链接是以无 ’/'结尾的方式访问的,于是服务器有了一次跳转。
      8. 避免重复的资源请求
      这种情况主要是由于疏忽或页面由多个模块拼接而成,然后每个模块中请求了同样的资源时,会导致资源的重复请求

            9 精简Javascript和CSS

    精简就是将Javascript或CSS中的空格和注释全去掉,

    复制代码
    复制代码
    body {
        line-height: 1;
    }
    ol, ul {
        list-style: none;
    }
    blockquote, q {
        quotes: none;
    }
    复制代码
    复制代码

    精简后版本

    复制代码
    body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}
    复制代码

    统计表明精简后的文件大小平均减少了21%,即使在应用Gzip的文件也会减少5%。

    用来帮助我们做精简的工具很多,主要可以参考如下,

    JS compressors:

    CSS compressors:

    与VS集成比较好的工具如下.


      二、代码级优化
      1. Javascript
      (1). DOM
      DOM操作应该是脚本中最耗性能的一类操作,例如增加、修改、删除 DOM元素或者对 DOM集合进行操作。如果脚本中包含了大量的 DOM操作则需要注意以下几点:
      a. HTML Collection(HTML收集器,返回的是一个数组内容信息)
      在脚本中 document.images、document.forms 、getElementsByTagName()返回的都是 HTMLCollection类型的集合,在平时使用的时候大多将它作为数组来使用,因为它有 length属性,也可以使用索引访问每一个元素。不过在访问性能上则比数组要差很多,原因是这个集合并不是一个静态的结果,它表示的仅仅是一个特定的查询,每次访问该集合时都会重新执行这个查询从而更新查询结果。所谓的 “访问集合” 包括读取集合的 length属性、访问集合中的元素。
      因此,当你需要遍历 HTML Collection的时候,尽量将它转为数组后再访问,以提高性能。即使不转换为数组,也请尽可能少的访问它,例如在遍历的时候可以将 length属性、成员保存到局部变量后再使用局部变量。
      b. Reflow & Repaint
      除了上面一点之外, DOM操作还需要考虑浏览器的 Reflow和Repaint ,因为这些都是需要消耗资源的,具体的可以参加以下文章:
    如何减少浏览器的repaint和reflow?
    Understanding Internet Explorer Rendering Behaviour
    Notes on HTML Reflow

      (2). 慎用 with
    with(obj){ p = 1}; 代码块的行为实际上是修改了代码块中的 执行环境 ,将obj放在了其作用域链的最前端,在 with代码块中访问非局部变量是都是先从 obj上开始查找,如果没有再依次按作用域链向上查找,因此使用 with相当于增加了作用域链长度。而每次查找作用域链都是要消耗时间的,过长的作用域链会导致查找性能下降。
      因此,除非你能肯定在 with代码中只访问 obj中的属性,否则慎用 with,替代的可以使用局部变量缓存需要访问的属性。
      (3). 避免使用 eval和 Function
      每次 eval 或 Function 构造函数作用于字符串表示的源代码时,脚本引擎都需要将源代码转换成可执行代码。这是很消耗资源的操作 —— 通常比简单的函数调用慢 100倍以上。
      eval 函数效率特别低,由于事先无法知晓传给 eval 的字符串中的内容,eval在其上下文中解释要处理的代码,也就是说编译器无法优化上下文,因此只能有浏览器在运行时解释代码。这对性能影响很大。
      Function 构造函数比 eval略好,因为使用此代码不会影响周围代码 ;但其速度仍很慢。
      此外,使用 eval和 Function也不利于Javascript 压缩工具执行压缩。
      (4). 减少作用域链查找(这方面设计到一些内容的相关问题)
      前文谈到了作用域链查找问题,这一点在循环中是尤其需要注意的问题。如果在循环中需要访问非本作用域下的变量时请在遍历之前用局部变量缓存该变量,并在遍历结束后再重写那个变量,这一点对全局变量尤其重要,因为全局变量处于作用域链的最顶端,访问时的查找次数是最多的。
      低效率的写法:
    // 全局变量 
    var globalVar = 1; 
    function myCallback(info){ 
    for( var i = 100000; i--;){ 
    //每次访问 globalVar 都需要查找到作用域链最顶端,本例中需要访问 100000 次 
    globalVar += i; 
    }

      更高效的写法:
    // 全局变量 
    var globalVar = 1; 
    function myCallback(info){ 
    //局部变量缓存全局变量 
    var localVar = globalVar; 
    for( var i = 100000; i--;){ 
    //访问局部变量是最快的 
    localVar += i; 

    //本例中只需要访问 2次全局变量
    在函数中只需要将 globalVar中内容的值赋给localVar 中区
    globalVar = localVar; 
    }
      此外,要减少作用域链查找还应该减少闭包的使用。
      (5). 数据访问
      Javascript中的数据访问包括直接量 (字符串、正则表达式 )、变量、对象属性以及数组,其中对直接量和局部变量的访问是最快的,对对象属性以及数组的访问需要更大的开销。当出现以下情况时,建议将数据放入局部变量:
      a. 对任何对象属性的访问超过 1次
      b. 对任何数组成员的访问次数超过 1次
      另外,还应当尽可能的减少对对象以及数组深度查找。
      (6). 字符串拼接
      在 Javascript中使用"+" 号来拼接字符串效率是比较低的,因为每次运行都会开辟新的内存并生成新的字符串变量,然后将拼接结果赋值给新变量。与之相比更为高效的做法是使用数组的 join方法,即将需要拼接的字符串放在数组中最后调用其 join方法得到结果。不过由于使用数组也有一定的开销,因此当需要拼接的字符串较多的时候可以考虑用此方法。

      关于 Javascript优化的更详细介绍请参考:
    Write Efficient Javascript(PPT)
    Efficient JavaScript
      2. CSS选择符
      在大多数人的观念中,都觉得浏览器对 CSS选择符的解析式从左往右进行的,例如
    #toc A { color: #444; }
      这样一个选择符,如果是从右往左解析则效率会很高,因为第一个 ID选择基本上就把查找的范围限定了,但实际上浏览器对选择符的解析是从右往左进行的。如上面的选择符,浏览器必须遍历查找每一个 A标签的祖先节点,效率并不像之前想象的那样高。根据浏览器的这一行为特点,在写选择符的时候需要注意很多事项,有人已经一一列举了, 详情参考此处。

      3. HTML
      对 HTML本身的优化现如今也越来越多的受人关注了,详情可以参见这篇 总结性文章 。

      4. Image压缩
      图片压缩是个技术活,不过现如今这方面的工具也非常多,压缩之后往往能带来不错的效果,具体的压缩原理以及方法在《 Even Faster Web Sites》第10 章有很详细的介绍,有兴趣的可以去看看。
      总结
      本文从页面级以及代码级两个粒度对前端优化的各种方式做了一个总结,这些方法基本上都是前端开发人员在开发的过程中可以借鉴和实践的,除此之外,完整的前端优化还应该包括很多其他的途径,例如 CDN、 Gzip、多域名、无 Cookie服务器等等,由于对于开发人员的可操作性并不强大,在此也就不多叙述了,详细的可以参考 Yahoo和Google 的这些“金科玉律。
    展开全文
  • 优化理论(1)

    2019-03-26 20:27:53
    优化本质上是一个优化问题,所以我们先来看优化问题是什么。 优化问题有三个最重要的因素:目标函数、优化变量、优化约束。一个简单的优化问题可以描述如下: 其中x为优化变量,而F(x)为优化函数。此问题称为...
  • 优化理论与方法

    2019-04-23 12:28:47
    优化问题 :eg:,其中x在控制问题中被称为为控制决策变量;在数学优化中叫做决策量。无论是最优控制还是数学优化(数学规划)都是优化问题,即都是这样的形式。 1. 优化的两个基本问题 确定一个优化的必要或/和...
  • 为什么需要优化算法优化算法可以加快收敛速度(未加入优化的神经网络训练时间比加入优化后时间更短),甚至得到一个更好更小的损失函数值。优化算法能帮你快速高效地训练模型。有哪些优化算法 Mini-Batch 梯度下降 ...
  • 何为优化?措施: 对应方法变得更优: 对应的结果更加的好优化: 动词,一种行为方法-----------&gt;目的是获得更好的结果,总之有所改善优化问题的三要素:(1) 决策变量所变:可以改变的量,可以优化的量,...
  • 优化的定义 1.1 凸优化 ...1.1 凸优化优化问题目前在机器学习,数据挖掘等领域应用非常广泛,因为机器学习简单来说,主要做的就是优化问题,先初始化一下权重参数,然后利用优化方法来优化这个
  • 我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等。最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素...
  • sql优化的几种方法

    2017-08-17 20:59:55
    在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上...
  • SEO优化网站教程6

    2019-08-23 09:04:49
    SEO优化网站教程之6个经典软件操作顺序6个经典软件操作顺序网站关键词优化到百度首页其主要关键在于网站内容关联建设,掌握【网站标题-网站首页长尾关键词建设-文章标题-文章内容】这三者紧密和高度关联性。...
  • sql优化的几种方式

    2019-11-11 09:15:50
    一、为什么要对SQL进行优化 我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化...
  • 网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的...
  • Win10必做的性能优化

    2019-05-17 10:14:16
    Windows10系统目前慢慢成为主流的操作系统,win7目前已经不再提供技术支持,到2020年正式退役。...由于win10系统功能变多,系统也变得臃肿,下面就给大家讲讲Windows10必做的优化。 1.关闭家...
  • SEO优化网站教程4

    2019-08-23 09:06:35
    SEO优化网站教程之文章插入长尾词内链技巧文章插入长尾词内链技巧下面我们举例说明一:下面我们举例说明二:有需要更全面的SEO优化网站软件工具及软件操作文档可以联系博主,会有更详细的教程,系统的帮助您的网站...
  • 做科研时,曾花了段时间学习凸优化,后来发现ML中其应用也非常普遍,想来今后可能还会接触,干脆做个系统的总结,方便以后查询。 博文内容主要参考Boyd(Stanford)的Convex Optimization,配套的slides,以及部分...
  • 粒子群优化算法(PSO)

    2019-07-22 09:51:31
    粒子群优化算法(Partical Swarm Optimization PSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。由于PSO操作简单、收敛速度快,...
1 2 3 4 5 ... 20
收藏数 2,335,257
精华内容 934,102
关键字:

优化