以下Arch Linux x86_64测试通过, 适用于纯手工安装维护的情况, 无须移除旧版本.
via.
- 定位到TeX Live 2010的安装目录, 默认是
/usr/local/texlive.# cd /usr/local/texlive - 将
/usr/local/texlive/2010目录复制为2011目录:# cp -a 2010 2011
夏日炎炎, 多多灌水, 有益身心健康.
Blekko的logo好像在前些日子由原来的beta升级为beta^2了, 页面正下方出现了一个名为"3 engine monte"的游戏. 玩法是, 输入"关键词 /Monte", 即可平行显示去格式后的Blekko, Google, Bing三方搜索结果, 用户可以根据经验猜测哪个结果是来自Blekko的, 点选以后即可显示猜测是否正确:
这里我以R为关键词进行搜索, 三个结果虽然都只有一页, 不过各有千秋. Google的结果明显偏重技术, bing的结果很杂, 不太靠谱. 而Blekko的结果的人为控制痕迹则比较明显, 基本上是一些比较权威信息源的首页.
“颐和园在我家北面,假如没有北这个方向的话,我就只好向南走,越过南极和北极,行程四万余公里到达那里。”
——《革命时期的爱情》
这里的"剖析"对应的单词是"profiling", 中文似乎没有词语能精准地表达出原词的内涵, 与"shell"的情况有点类似, 所以就不去刻意翻译了. 由于没有学过软件工程, 不吝先贴一段wiki上profiling的定义[1]:
In software engineering, program profiling, software profiling or simply profiling, a form of dynamic program analysis (as opposed to static code analysis), is the investigation of a program's behavior using information gathered as the program executes. The usual purpose of this analysis is to determine which sections of a program to optimize - to increase its overall speed, decrease its memory requirement or sometimes both.
要提高R程序的运行速度, 不仅仅需要剽悍的机器(单核高频, 多核并行, GPU)和高效的代码(向量化, 混合编程), 寻找程序中的性能瓶颈并进行有针对的优化也是很重要的, "找到北这个方向", 就是profiling的意义所在.
R中其实自带了几个最简单的profiling工具, 我们或多或少都接触过:
base::system.time() —— 简陋的计时秒表utils::Rprof() —— 对CPU的简易profile工具utils::Rprofmem() —— 对内存的简易profile工具关于这些函数的使用, 可以参看Ross Ihaka的说明[2]. 与此同时, CRAN上profr(Hadley Wickham)和proftools(Luke Tierney)两个微型包均提供了可视化Rprof()函数输出结果的能力. 但是, 这类简单的profiling只将程序拆解了到了单个R运算的层次, 没有提供更深一层, 即profiling compiled code的功能. R原生支持这个特性, 但需要在编译时对默认选项进行简单的修改[4].
翻看Dirk Eddelbuettel牛在useR2010上的RhpcTutorial[3], 其中提到了Google员工开发的Google Perftools可以profiling compiled code. 试了一下, 感觉是个不错的工具, 配合kcachegrind, 还可以将结果可视化.
测试环境: Arch Linux x86_64
AUR上已有一位大人在维护google-perftools(源代码安装):
sudo yaourt -S google-perftools
Fedora:
sudo yum install google-perftools
Ubuntu:
sudo apt-get install google-perftools
不过Ubuntu/Fedora仓库中的二进制包可能比较陈旧了, 无妨直接自行编译最新版本:
svn checkout http://google-perftools.googlecode.com/svn/trunk/
在Arch x86_64下, google-perftools的默认安装路径为
/usr/bin
库文件libprofiler.so位于
/usr/lib
Google Perftools工具集中除了名为pprof的CPU profiler以外, 还提供了堆内存泄漏检测/使用情况统计等工具. 这里我们只关注pprof就可以了: 它通过CPU中断采样的方式统计每个函数被采样的次数, 占总采样次数的百分比, 调用的子函数的被采样次数等等(可以说"剖析"在此处还是比较恰当的). 最后通过这些信息寻找程序的(CPU)性能瓶颈.
要和R一起使用, pprof有两种可行的运行方式, 第一种比较硬朗: 在编译选项中直接加入对libprofiler.so的引用, R在运行时就会自动加载libprofiler库:
wget http://cran.r-project.org/src/base/R-2/R-2.13.1.tar.gz tar -xf R-2.13.1.tar.gz cd R-2.13.1 export MAIN_CFLAGS="-pg" export MAIN_FFLAGS="-pg" export MAIN_LDFLAGS="-pg" export LDFLAGS="-lprofiler" # 也可显式指定路径: # export LDFLAGS="-L/usr/lib -lprofiler" ./configure --enable-R-shlib |
参数 -pg 打开R的profiling支持, 设定LDFLAGS用以连接libprofiler库.
configure完成:
R is now configured for x86_64-unknown-linux-gnu
Source directory: .
Installation directory: /usr/local
C compiler: gcc -std=gnu99 -g -O2
Fortran 77 compiler: gfortran -g -O2
C++ compiler: g++ -g -O2
Fortran 90/95 compiler: gfortran -g -O2
Obj-C compiler:
Interfaces supported: X11
External libraries: readline, ICU, lzma
Additional capabilities: PNG, JPEG, TIFF, NLS, cairo
Options enabled: shared R library, shared BLAS, R profiling, Java
Recommended packages: yes
结果无误, 开始编译安装:
make && sudo make install |
这样, 连接了libprofiler.so的R编译成功.
第二种使用pprof的方式则相对委婉: 使用时动态预加载库文件就可以了, Dirk大人的RhpcTutorial中已经给出说明, 此略.
选取《Wringting R Extension》 3.2节中给出的一个例子进行测试:
#!/usr/local/lib64/R/bin/Rscript suppressMessages(library(MASS)) suppressMessages(library(boot)) storm.fm <- nls(Time ~ b*Viscosity/(Wt - c), stormer, start = c(b=29.401, c=2.2183)) st <- cbind(stormer, fit=fitted(storm.fm)) storm.bf <- function(rs, i) { st$Time <- st$fit + rs[i] tmp <- nls(Time ~ (b * Viscosity)/(Wt - c), st, start = coef(storm.fm)) tmp$m$getAllPars() } rs <- scale(resid(storm.fm), scale = FALSE) storm.boot <- boot(rs, storm.bf, R = 500) |
将profiling结果记录到文件:
chmod 755 profiling.R CPUPROFILE=rprof.out ./profiling.R |
这里在写R文件时用了一点点技巧, 使得它能够支持类Unix系统的Shebang特性而直接执行, 参考[7], [8].
执行完毕后, 我们即可使用pprof来分析输出的结果文件(一个二进制文件!)了. pprof可以将此文件解析成你想要的各种可读的形式. 其参数如下:
pprof --option [ --focus=< regexp > ] [ --ignore=< regexp > ]
[--line or addresses or functions] 可执行文件路径 结果文件路径
方括号为可选项目, < regexp >为正则表达式.
具体的选项分为几组. 其中输出格式的基本可选项为:
text, callgrind, gv, evince, web, symbols, dot, ps, pdf, svg, gif, raw, list=< regexp >, disasm=< regexp >.
text 表示字符统计输出形式, 其它均对应各自的图形格式;
list=< regexp > 表示输出匹配正则表达式的函数的源代码;
diasm=< regexp > 表示输出匹配正则表达式的函数的反汇编代码.
其他比较重要的参数:
--focus=< regexp > 表示只统计函数名匹配正则表达式的函数的采样;
--ignore=< regexp > 表示不统计函数名匹配正则表达式的函数的采样;
[--line or addresses or functions] 表示生成的统计是基于代码行, 指令地址还是函数的, 默认是函数.
这里仅输出文字型结果:
pprof --cum --text /usr/local/lib64/R/bin/Rscript rprof.out | less |
结果中的前15位:
Total: 254 samples
2 0.8% 0.8% 213 83.9% Rf_applyClosure
24 9.4% 10.2% 213 83.9% Rf_eval
0 0.0% 10.2% 213 83.9% do_begin
0 0.0% 10.2% 212 83.5% do_set
0 0.0% 10.2% 206 81.1% do_internal
0 0.0% 10.2% 148 58.3% do_lapply
7 2.8% 13.0% 123 48.4% Rf_evalList
0 0.0% 13.0% 107 42.1% Rf_ReplIteration
0 0.0% 13.0% 104 40.9% R_ReplConsole
0 0.0% 13.0% 102 40.2% Rf_usemethod
0 0.0% 13.0% 100 39.4% run_Rmainloop
0 0.0% 13.0% 96 37.8% main
0 0.0% 13.0% 92 36.2% __libc_start_main
0 0.0% 13.0% 85 33.5% do_usemethod
1 0.4% 13.4% 85 33.5% forcePromise
输出结果中, 每行对应着一个函数的统计:
如果你的系统中安装了gnu-gv或evince, 即可直接即刻显示一幅无码清晰大图(ps/pdf):
pprof --gv /usr/local/lib64/R/bin/Rscript rprof.out pprof --evince /usr/local/lib64/R/bin/Rscript rprof.out |
其他几个比较常用的选项可能是
生成PDF:
pprof --pdf /usr/local/lib64/R/bin/Rscript rprof.out > rprof.pdf |
生成SVG:
pprof --svg /usr/local/lib64/R/bin/Rscript rprof.out > rprof.svg |
生成GraphViz所支持的dot格式:
pprof --dot /usr/local/lib64/R/bin/Rscript rprof.out > rprof.dot |
当然, 要想读懂图中的内容, 从而针对某些部分进行优化, 还需要对R的底层比较熟悉才行: 最起码要了解涉及到的C函数的具体功能.
pprof可将输出转化为强大的Valgrind工具集中的组件Callgrind可采用的格式, 配合KCachegrind这个图形前端, 即可对结果进行简单的可视化, 能够交互哦亲:
# For Arch Linux # sudo pacman -S kdesdk-kcachegrind pprof --callgrind /usr/local/lib64/R/bin/Rscript rprof.out > rprof.callgrind kcachegrind rprof.callgrind |
其实看上去KCachegrid就是做了一个最普通的树可视化, 所以理论上我们其实可以用角度各异的无数种手段展示profiling结果: 就是画一棵树嘛. 不过KCachegrind中可以与图形交互, 进一步的分析很方便, 大家可以自己进一步体验.
Writing R Extensions[6]提到另外两个可供Linuxer选择的工具: sprof和oprofile, 我没有实验, 感兴趣的同学不妨实践一下.
[1] Wikipedia - Profiling (computer programming).
[2] Ross Ihaka. Writing Efficient Programs in R (and Beyond).
[3] Dirk Eddelbuettel. Introduction to High-Performance Computing with R. pp. 29-35
[4] R Installation and Administration. Version 2.13.0 (2011-04-13) Appendix B.1, B.7.
[5] 冯文龙. 使用google-perftools剖析程序性能瓶颈.
[6] Writing R Extensions. Version 2.13.0 (2011-04-13) pp. 69-71.
[7] Wikipedia - Shebang.
[8] shebang line not working in R script.
这是Springer Statistics and Computing丛书中《Graphics of Large Datasets: Visualizing a Million》一书的第11章. 内容是对InfoVis 2005会议竞赛单元所提供数据集的可视化和分析. 作者之一的Martin Theus也是R的交互式图形包iPlots和R的Java GUI前端JGR的作者.
单独将这章提出来的原因是, 一般相关书籍和资料比较偏重理论, 例证比较零散, 不够系统, 往往缺乏对现实数据集完整的分析. 这样贴近现实而详尽的材料相对难得.
半年前做了一部分, 这两天放假又整理了一下就放上来了. 图形提取自原书电子版, 在内容和版式上尽力保持了原书风貌.
值得一提的是, 竞赛结果中位列1st的两队之一是来自IAState的Heike Hofmann, Hadley Wickham, Dianne Cook, Junjie Sun, Christian Röttger, 而本书的三位作者之一是Heike Hofmann. 本书也是本章的两位作者所在队位居2nd.
小鸡为什么要过马路呢?
因为TeX Live很容易安装.
Arch下可以通过pacman从官方的[extra]仓库中安装重新打包后的TeX Live, Arch Wiki上有详细介绍, 不过考虑到下游打包带来一系列可能的问题, 我更倾向于使用TUG发布的ISO手工安装, 所以, 具体过程理论上也适用于其他发行版.
TeX Live 2011目前处于pretesting状态, 这里以已经frozen的2010为例.
# su -
# wget -c http://mirrors.ustc.edu.cn/CTAN/systems/texlive/Images/texlive2010.iso
# mkdir /mnt/tex
# mount -o loop texlive2010.iso /mnt/tex/
# cd /mnt/tex/
# ./install-tl
出现文字安装向导, 无妨自定义一下组件, 比如有选择地将Plain TeX/Omega/LuaTeX/ConTeXt/游戏排版/乐谱排版等不常用组件去掉, 多语种支持也一样, 我只保留了中文/英文/拉丁文/西里尔文字的支持. 选项比较多时一定要注意区分输入字母的大小写. 按I开始安装.
安装完成, 提示修改$PATH, $MANPATH和$INFOPATH. 不过话说我从来没有man xetex过, 这里可以暂且跳过.
更新宏包有益身心健康:
# tlmgr option repository http://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet
# tlmgr update --self
# tlmgr update --all
# umount /mnt/tex
# rm -rf /mnt/tex
Done.
扔了已经用了一个月的Fedora, 换了Arch.
今天这些发行版之间没有太多的差别, 基本就一个包管理工具不同, 再就是追新的狂热程度不同而已, 其他方面的同质化非常严重. 之前的Fedora 15用起来有些致命的问题: evince假死, Virtualbox假死, flash插件假死, kill都不好使, 几乎只能重启, 定制起来又不是很方便, 所以花了一天时间迁移到了Arch.
安装过程很简单, 用四个字概括就是: 一劳永逸.
细节上的定制也非常方便. 用yaourt换上了AUR里的
freetype2-ubuntu
fontconfig-ubuntu
libxft-ubuntu
cairo-ubuntu
四个被打了十全补丁的库以后, 再用Gnome Tweak Tool改一下hinting的细节, 字体渲染效果就相当不错了. Arch便捷集中的文本式配置, AUR/yaourt, 让我体会到了Ubuntu和Fedora都没能提供的前所未有的自由.
用了一会儿以后, 感觉命令行真的可以提高工作的效率, 就算有正事, 开了X以后, 有时也是迷茫的四处游荡, 一会开个网页, 一会开个播放器 ... Arch/gentoo这样的发行版注定是相对小众的, 但日趋式同的那些发行版又将去向何方?