• 原文:Use gprof to check your codes for performance issues
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com
    版本:V 1.0.0
    时间:2007-8-30

    通过阅读IBM DevelopWorks上的使用 GNU profiler 来提高代码运行速度,我掌握了使用gprof来分析代码的性能瓶颈,以减轻我工作的技术。下面就来分享一下我的经验。

    我们先看看GNU profiler工作的几个简单步骤。

    为了使用gprof,只需在用gcc编译C/C++代码时加上-pg选项。假设要编译的源代码是gp-test.c。

    gcc -pg -g2 -o gp-test{,.c}

    -pg是启用gprof,-g2设置调试模式为2,-o指定二进制输出,我使用了大括号扩展来减少我的输入。

    接着运行可执行文件,将产生gmon.out。

    ./gp-test

    有了gmon.out,我们就可以使用gprof来剖析我们的代码。

    gprof gp-test gmon.out > result.txt 

    我倾向于把输出保存为一个文件'result.txt',以利于将来的比较和分析。

    让我们举一个C例子代码,试着找到关键点。

    #include
    int twoD[10000][10000]={0};
    int update_d1()
    {
    int i,k=0;
    for (i=0;i<10000;i++)
    twoD[i][1]=k++;
    }
    int update_d2()
    {
    int i,k=0;
    for (i=0;i<10000;i++)
    twoD[1][i]=k++;
    }
    int main(int argc, char * argv[])
    {
    int i,j,k=0;
    if (argc!=2)
    return -1;
    if (*(argv[1])=='1')
    update_d1();
    else if (*(argv[1])=='2')
    update_d2();
    else
    printf("\nInvalid value %s\n",argv[1]);
    return 1;
    }

    函数update_d1()和update_d2()循环一样的次数来访问二维数组。设这二维数组为twoD[row][column],update_d1()访问行(row),update_d2()访问列(column)。我们发现这两个函数的运行时间差很大。让我们用gprof剖析一下吧。

    gcc -pg -g -o gp-test{,.c}
    ./gp-test 1
    gprof gp-test gmon.out > t1
    ./gp-test 2
    gprof gp-test gmon.out > t2

    观察剖析结果:

    using update_d1() :
    % cumulative self self total
    time seconds seconds calls ms/call ms/call name
    100.52 0.06 0.06 1 60.31 60.31 update_d1
    using update_d2() :
    % cumulative self self total
    time seconds seconds calls Ts/call Ts/call name
    0.00 0.00 0.00 1 0.00 0.00 update_d2

    update_d1()花费0.06秒,update_d2()少于0.01秒,为什么呢?

    让我们再看看这个二维数组twoD[row][column]。这个数组在物理上映射为一整块内存,而不是按行列排列。这内存块以0行1列开始,而第一行第一列实际是第10001块。

    想象一下update_d1()怎样访问内存?为了访问每行,你需要越过10000块,而update_d2()可以直接访问那10000块。这就是延迟的原因。

  • 查找公共IP地址 - [LBE]

    2007-08-27

    原文:What is my Public IP Address?
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com
    版本:V 1.0.0
    时间:2007-8-27

    我的公共IP地址是多少?很多网站都提供此类信息。如何在我的脚本程序中使用它们呢?我们可以使用curl和grep。

    首先,找几个提供查询公共IP地址服务的网站。

    http://www.ipchicken.com/--那只鸡很搞笑。
    http://whatismyip.com/--一个男孩在玩VR游戏
    http://myip.dk/--很简单的一个网站,但也符合我们的要求

    其次,先下载该网页再检索(grep)IP。

    curl -s http://myip.dk/ | egrep -m1 -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

    没有安装curl的话可以使用wget。

    wget -qO - http://myip.dk/ | egrep -m1 -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

    最重要的部分是正则表达式。[0-9]匹配0-9之间的数字,{1,3}匹配前面的模式1到3次。-o打印匹配的部分,-m1在第一次匹配后,grep就停止。

    http://whatismyip.org--不用grep,只要curl就行了。

    curl -s http://whatismyip.org/

    好像从http://whatismyip.org/获得公共IP地址比较方便,但是该网站在10分钟内只允许访问三次。

    毕竟,我喜欢用正则表达式grep。

  • cjkspace 是编写LaTeX文档辅助工具,在中英文之间插入波纹号(~),也可以是其他符号如空白或问号等。中英文之间空白的讨论可以参考李果正先生的博文:中英文字间空白。虽然这里说的是中英文,但程序中汉字的定义使用的是Unicode的 CJK 字符集,因此应该也支持日文和韩文。程序对中英文的定义都可以重新定义或扩展,如对德文或法文的支持等。cjkspace使用的是Python的内置编码器,支持大部分的文字编码,如gbk、gb18030、big5等,不指明的话,使用utf8,可以使用``cjkspace -l''查询已知编码。

    程序在插入间隔符前,将删除中英文之间的所有空格。在多文件输入时,输出文件名由程序自动在原文件名后加.out后缀,若此时使用`-o'指定输出文件名,程序将予以警告,不会出错。

    更多信息请看下载文件中的 cjkspace.pdf。

    下载(注意为.tar.bz2格式,下载后可能要修改):cjkspace.tar.bz2 

  • Compiz Fusion是Compiz和Beryl合并的结果,很让人期待。前几天翻译一篇文章提到compiz,当时安装没成功,总是重启X Server。当时就怀疑是显卡驱动的问题,今天把显卡驱动重装了一下,总算把Compiz Fusion装上了。注意以下安装过程是针对Debian不稳定版(sid)的,stable用户可能装不上。

    1、卸载掉以前安装的compiz和beryl。

    2、添加安装源到/etc/apt/source.list

    deb http://download.tuxfamily.org/osrdebian unstable compiz-fusion-git
    

    3、下载密钥并安装

    $ wget http://download.tuxfamily.org/osrdebian/61B8DB62.gpg
    # apt-key add 61B8DB62.gpg
    

    4、开始安装

    # apt-get update
    # apt-get install compiz compiz-fusion-plugins-main compizconfig-settings-manager compiz-fusion-plugins-extra compiz-gnome emerald fusion-icon
    

    5、修改/etc/X11/xorg.conf

    添加

    Section "Extensions"
    Option "Composite" "enable"
    EndSection
    

    在Device段添加

    Option "XAANoOffscreenPixmaps" "true"
    

    6、重启X Server。

    Ctrl+Alt+BackSpace

    7、运行Compiz Fusion

    菜单Applications->System Tools->Compiz Fusion Icon。

    8、Compiz Fusion自启动

    想让Compiz Fusion自启动,只要把fusion-icon添加到Sessions即可。

    看几张截图:


    参考:Compiz Fusion & XFCE4/Sid
  • 六级过了 - [学习生活]

    2007-08-18

    六级过了,太令人兴奋了。这一次和上次一样都没有准备,这次怎么就过了呢??这运气来了挡都挡不住,哈哈!
        听力:175
        阅读:199
        综合:39
        写作:88 

    这一次写作最让我满意,上一次就是栽在写作上的,上次好像才考了30多分,一下子就多出了50多分,不过才怪,哈哈。 

    查分网址:http://cet.etang.com
    吉林省考生可以通过身份证号查询准考证号:http://league.nedu.edu.cn/cpic/gznedu/060606/