为了给笔记本省电,准备使用 Edge 浏览器+SS+PAC 代理规则来优雅的实现科学上网,同时由于要利用 IPV6 来节省校园网流量,于是根据使用的 ipv6 的 hosts 修改出了这份白名单 PAC 规则( https://raw.githubusercontent.com/autulin/update-ipv6-hosts-and-generate-proxy-whitelist/41197d5ddcd513991dd685f33a5f9064f9badd33/pac.txt ),但是在使用后发现, SS 使用 PAC 规则时,进程中的 svchosts.exe 进程资源占用会特别的大(内存占用 100MB-600MB 之间, CPU 偶尔 60%-90%之间跳动),这个在另外一台 win10 上也成功复现,所以来请教大神,是 win10 使用 SS+PAC 规则本身很耗费资源?还是我这个 PAC 规则有问题?不是很懂 PAC 的底层实现原理,不知道有什么解决办法吗?
1
xupefei 2016-11-26 20:23:07 +08:00
我大概看了看,你这个是 O(n) 复杂度吧?
Edge 为什么不用 AdBlock 或 uBlock (暂未上架,需手工安装 https://github.com/nikrolls/uBlock-Edge )呢? |
2
vugusurk 2016-11-26 20:25:56 +08:00
LZ 听说过正则吗
|
3
autulin OP |
4
autulin OP 不知道为啥不能 append 主题,我解释一下为什么没有用正则表达式来涉及这些规则:
我这个 PAC 规则里面的网址都是用 py 自动从 hosts 里面提取出来的,涉及到的域名很多,手动用正则来描述这些域名的确可以节省规则条数,但是人工的工作量太大,所以是目前现在这个样子。 但是我在 Chrome 的 SwitchOmega 或者 Firefox 的 AutoProxy 插件之中用这同样的规则做了一套 AutoProxy 的规则( https://github.com/autulin/update-ipv6-hosts-and-generate-proxy-whitelist/raw/master/autoproxy-whitelist-for-byr.txt ),并没有什么性能上的问题。我想可能对于 PAC 规则来说,系统在执行上本身没有什么优化吧。 @xupefei @vugusurk |
5
bellchu 2016-11-26 20:52:05 +08:00 via iPad 1
function FindProxyForURL(url, host) {
// If the hostname matches, send direct. if ( shExpMatch(host, "(*.taobao.com|taobao.com)") || shExpMatch(host, "(*.wechat.com|wechat.com)")) return "DIRECT"; // If the requested website is hosted within the internal network, send direct. if (isPlainHostName(host) || shExpMatch(host, "*.local") || isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") || isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") || isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0") || isInNet(dnsResolve(host), "111.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "123.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "180.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "220.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "103.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "205.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "140.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "110.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "202.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "211.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "117.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "42.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "103.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "125.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "61.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "203.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "123.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "140.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "219.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "119.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "182.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "192.100.0.0", "255.255.0.0") || isInNet(dnsResolve(host), "14.0.0.0", "255.0.0.0")) return "DIRECT"; // DEFAULT RULE: All other traffic, use below proxies, in fail-over order. return "PROXY 127.0.0.1:1080"; } 自己微调吧,虽然我不用 SS ,但这是标谁格式,肯定能用,这么短,可以避免一些麻烦。 |
6
autulin OP @bellchu
嗯,我找时间试试看这种形式性能会不会高一点,不过你可以看我需要的白名单域名那么多,感觉这里会还是会很长很长啊 // If the hostname matches, send direct. if ( shExpMatch(host, "(*.taobao.com|taobao.com)") || shExpMatch(host, "(*.wechat.com|wechat.com)")) return "DIRECT"; |
8
Tink 2016-11-26 21:38:37 +08:00
讲道理你这个还不如直接用主域名呢
|
12
favtony 2016-11-27 00:12:48 +08:00 via Android
个人觉得可能是 win10 某个服务不支持 pac 导致出 bug 了一直占用 cpu...
|