以下是内页友链:
从 2015-03-10 起,外链数过多的博客将被移动到内页中
先吐槽一句:BAE就是个渣!!!!!!!!!
下面还是以贴吧签到助手为例介绍一下BAE/SAE应用提速的技巧:
1.禁用内存缓存
对,你没有看错,的确是禁用内存缓存。因为内存缓存服务器与Web服务器不在同一台服务器上,有时候甚至比直接去MySQL数据库取还要慢,建议使用数据库来做缓存表
2.能用CDN就用吧
像jQuery,用各大网站提供的CDN速度都不错,比起放在BAE/SAE上要快很多。当然BAE是个特例,就算用他们的CDN依然慢的要死
3.合并请求
把CSS、JS都合并成一个文件,虽然看单个文件比较大,但是请求一个文件的时间要比两个文件的时间短很多
4.云 ≠ 高速
永远记住,SAE上的运算速度是VPS的1/10,BAE上的运算速度是VPS的1/1000000(BAE能用?)
这是开发签到助手时遇到的问题……
需求:从数据库取没有签到的TID
原来的代码:
SELECT tid FROM sign_log WHERE status IN (0, 1) AND date='{$date}' ORDER BY RAND() LIMIT 0,1
当 sign_log 这个表非常大的时候,会出现 filesort 罢工的现象
EXPLAIN 的提示:Using where; Using temporary; Using filesort
这是由于 MySQL 在执行过程中需要遍历数据库,然后给每行分配一个权重值(因为用的是RAND函数),之后再用 filesort 的方式排序临时表,最后输出。
只是取一个tid而已……有必要遍历整个表么?有没有替代的方案呢?
答案是肯定的。这个算法分为3步,将上面一个查询拆解为2个:
1.从数据库取出最大数据量:
SELECT COUNT(*) FROM `sign_log` WHERE status IN (0, 1) AND date='{$date}'
2.用 PHP 的 rand 函数计算出 offset 值
$offset = rand(1, $count) - 1;
3.直接从数据库取出这一行的tid:
SELECT tid FROM `sign_log` LIMIT {$offset},1
(再次运行时可以略过第一步)
测试结果(共13506行数据):
ORDER BY RAND():
Using where; Using temporary; Using filesort
运行时间:0.0050160884857178秒优化后:
查询1:Using where
查询2:Using index(注:tid字段有索引)
总运行时间:0.0021970272064209秒
改进后不仅提升了运行速度,还解决了 filesort 数据量上限的问题
写在前面:
千万别买 HP 的笔记本了……
真把自己当老大了?还锁 BIOS……
就那几个选项你也好意思叫做BIOS?
如何修改硬盘工作模式:
1.确保已经开启 UEFI 模式
2.准备一个 FAT32 格式的 U 盘
3.下载并解压 BOOTX64.zip,扔到 U 盘根目录和 /EFI/BOOT/ 下
4.重启电脑,按 F9 选 U 盘启动
5.键入命令:
setup_var 0x39 0x01
6.按 Ctrl Alt Del 键重启,工作模式切换完毕
附各模式和值的对照表:
command offset value
setup_var 0x39 0x00 (IDE兼容模式)
setup_var 0x39 0x01 (AHCI模式)
setup_var 0x39 0x02 (RAID模式)
1.打开BAE开发者中心,新建应用:http://developer.baidu.com/dev#/create
2.点击左侧“云环境”,填入域名
3.点击创建新版本
4.左侧找到“MySQL数据库”,新建一个,按默认设置即可
5.确定后,记下数据库名称(这里是WRclCoCBqnsrEQxNRjlW),忘了也没关系,等会可以回来看的
6.打开压缩包,解压system/config.cfg.php
7.按照提示编辑好信息
8.压缩回去
9.回到百度平台,点击左侧“版本管理”,“包上传更新”,上传编辑好的压缩包
10.点击上线按钮,再点击“查看”
11.点击左下角的注册按钮,注册一个号(不用邀请码的)
12.进入“设置”,修改设置并填入cookie(获取方法页面有介绍)
13.回到“我喜欢的吧”,刷新下列表
14.回BAE,找到左侧“Cron 定时任务”,添加以下计划任务
名称 | URL | 执行次数 | 时间表 |
Sign | http://你的域名.duapp.com/cron.php | 0 | * * * * * |
15.搞定,等第二天签到结果吧
这学期程序设计学的是Java,期末要求制作一个计算器:
花了一个晚上搞定,CalcWindow类负责界面绘制,Main类是主程序,关键代码如下:
package com.kookxiang.calc; import javax.swing.JOptionPane; public class Main { CalcWindow UI; double cur_num = 0; double prev_num = 0; boolean autoclean = false; boolean dotted = false; boolean last_equal = true; int mode = Mode.ADD; public void clear(){ cur_num = prev_num = 0; autoclean = dotted = false; last_equal = true; mode = Mode.ADD; UI.numberBox.setText("0"); } public void cal(){ boolean _last_equal = last_equal; last_equal = true; String txt=UI.numberBox.getText(); if(!_last_equal) eval(); switch(mode){ case Mode.ADD: prev_num = prev_num + cur_num; break; case Mode.MINUS: prev_num = prev_num - cur_num; break; case Mode.MUILTIPLY: prev_num = prev_num * cur_num; break; case Mode.DIVISION: prev_num = prev_num / cur_num; break; } txt = prev_num+""; UI.numberBox.setText(txt); http:// 消掉结尾的 *.0 if(txt.endsWith(".0")) UI.numberBox.setText(txt.substring(0, txt.length()-2)); autoclean = true; if(Double.isNaN(prev_num) || Double.isInfinite(prev_num)){ clear(); JOptionPane.showMessageDialog(null, "发生未知错误"); } } public void eval(){ if(!last_equal) cal(); prev_num = cur_num; dotted = false; autoclean = true; cur_num = Double.parseDouble(UI.numberBox.getText()); } public void onCreate(String[] flags){ UI = new CalcWindow(this); clear(); } public static void main(String[] args) { new Main().onCreate(args); } public void handleAction(String command) throws Exception { String txt=UI.numberBox.getText(); if(txt.equals("0")) txt = ""; switch(command){ case "exit": System.exit(0); break; case "clear": clear(); break; case "backspace": if(txt.isEmpty()) return; if(autoclean){ UI.numberBox.setText(""); autoclean = false; return; } UI.numberBox.setText(txt.substring(0, txt.length()-1)); break; case "dot": if(dotted) return; dotted = true; command = "."; case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": case "0": case ".": UI.numberBox.setText(autoclean ? command : txt + command); autoclean = false; last_equal = false; break; case "dn": if(txt.isEmpty()) return; if(txt.substring(0, 1).equals("-")){ UI.numberBox.setText(txt.substring(1)); }else{ UI.numberBox.setText("-"+txt); } break; case "add": if(txt.isEmpty()) return; eval(); mode = Mode.ADD; break; case "minus": if(txt.isEmpty()) return; eval(); mode = Mode.MINUS; break; case "multiply": if(txt.isEmpty()) return; eval(); mode = Mode.MUILTIPLY; break; case "division": if(txt.isEmpty()) return; eval(); mode = Mode.DIVISION; break; case "cal": cal(); break; default: throw new Exception("Unknown command"); } } }
完整源代码下载:Calculator.rar
终于加入缓存功能了
再也不用担心用了太多正则匹配影响效率了~
现在将歌词处理结果自动储存在cache文件夹
然后遇到kk_lrc标签时通过md5的方式得到缓存id,直接取出缓存歌词
放首歌测试: