2009年四月月 发布的文章

梅西·绝杀赫塔菲预示夺冠

2009年4月19日凌晨2点(北京时间),2008-09赛季西甲联赛第31轮拉开战幕,西甲领头羊巴塞罗那队坐客马德里挑战小球会赫塔菲队。赫塔菲目 前在西甲排在中下游,有保级压力,但是近几年巴萨对阵赫塔菲的战绩并不占优,特别是在赫塔菲的主场。本赛季赫塔菲也是巴萨唯一没能战而胜之的对手了。 04/05赛季和05/06赛季巴萨都在客场战胜了对手,最终巴萨也都获得了最终的西甲冠军;如果本场比赛巴萨能战胜赫塔菲,起码会从心理上给巴萨众将士 带来好兆头。所以本场瓜迪奥拉也是派出了除了亚亚图雷之外的最强阵容,试图在客场打垮对手保持领先。本场比赛也是门将巴尔德斯代表巴萨出场的第300场比 赛,同时也是梅西上演世纪进球两周年的纪念日。

一 开场,巴萨就反客为主,通过强大的控球优势,向对方腹地发起一波接着一波的进攻。第5分钟,巴萨完成了本场第一次射门。伊涅斯塔将球直传给快速插上梅西, 对方球员到底铲球将球断下,梅西也因用力过猛以及湿滑的场地而差点滑倒,球被铲倒了左路亨利的脚下,亨利获得了直面门将的绝佳单刀机会。不过亨利的射门居 然被赫塔菲神勇的门将斯托伊科维奇扑出了,也正是这一扑救激发了斯托伊科维奇的状态,他在本场的神奇表演也就此开始了。

开场后,对方后卫对梅西照顾的很紧,梅西几次尝试突破和传球都失误了,不过梅西依然是巴萨前场最具威胁的球员。第15分钟和第18分钟,亨利左路再获两次绝佳的得分机会,但是赫塔菲门将居然神奇的将两个球都扑出了,亨利也是一脸的无奈。

img{512x368}
梅西突破

但 是第19分钟,梅西没有再让斯托伊科维奇上演神奇,哈维右路拿球突到禁区,将球分给中路的梅西,梅西拿球后先是一个晃动将对方后卫的一次倒地铲球躲过,然 后向左横向带球趟过正门两名后卫,闪出空档后左脚大力抽射,球打在对方倒地后卫的身上弹射入网,梅西打入其联赛的第20粒入球。斯托伊科维奇对这样的射门 毫无办法,巴萨1:0领先。

img{512x368}
梅西射门前横向带球

巴 萨队员没有因1:0的领先而放缓进攻,一波波的进攻考验着赫塔菲的后防线。高达75%的控球让赫塔菲队员只能忙于奔跑抢球,可是球却牢牢的长在了巴萨队员 脚上。巴萨后防线没有受到太大威胁,巴萨整体前移进一步威胁赫塔菲的球门。第26分钟,巴萨获得角球机会,中卫皮克在对方门前打出一记超级精彩的侧身倒钩 射门,可惜这个球再次被斯托伊科维奇神奇的扑出。面对如此精彩的扑救,皮克也是无奈的双手抱头。如果说梅西是本场进攻MVP的话,那斯托伊科维奇绝对是防 守方的MVP。

第39分钟,梅西突破至禁区,对方后卫侧面绊倒梅西,慢镜表明这是个明显的犯规,应该判罚点球,但是主裁没有理会。场外的瓜迪奥拉甚是气愤,差点又爆发出来,不过可能是因为吸取的上次的教训,瓜帅忍了。带着1个球的领先优势巴萨结束了上半场的比赛。

下 半场巴萨没有更换队员,但天空的雨是越下越大了。场上时常看到球员滑倒的场面。巴萨的进攻也放缓了,以控制球为主。这也给了主场作战的赫塔菲队以机会。下 半场前10分钟,赫塔菲发起了多次进攻,可惜前场队员的配合失误葬送了大好的机会,另外巴尔德斯门前的控制也恰到好处。第56分钟,梅西接埃托奥直传反越 位形成单刀,但是边裁却举起了越位的旗帜,慢镜显示这又是一个误判。梅西的突破让对方后卫先后都吃到了黄牌。第81分钟,梅西再次遭到误判,凯塔远射被对 方门将神奇补出,梅西快速插上补射中的,但是这时边裁再次举旗示意越位,慢镜回放再次显示这是一个好球。如果不是裁判的表演,本场梅西上演帽子戏法都不为 过。

img{512x368}
雨中斗士

img{512x368}
梅西倒钩射门

梅西没有放弃,终场前两次助攻埃托奥,后者的射门一次偏出,一次击中门柱。补时3分后,全场比赛结束,梅西绝杀赫塔菲,巴萨取得六连胜,继续领跑。客场战胜赫塔菲是否预示巴萨将最终夺得本赛季西甲冠军呢?相信巴萨球员最终会给我们一份完美的答案。


微博:@tonybai_cn
微信公众号:iamtonybai
github.com: https://github.com/bigwhite

简说GLIBC strncpy实现

比较以下两组代码,你认为哪组运行的更快些呢?
Example1:
        int n   = 100;
        int n4  = n >> 2;
        int i   = 0;

        int a[100];

        for (i = 0; i < n4 ;i += 4) {
                a[i] = i;
                a[i+1] = i+1;
                a[i+2] = i+2;
                a[i+3] = i+3;
        }

Example2:
       for (i = 0;i < 100;i++) {
             a[i] = i;
       }

其实这个问题在"代码大全2nd"中也有讨论,从"代码大全"中的统计结果来看,一般来说Example1更占有优势。我在solaris上做了测试,在未开优化的情况下:两者运行时间分别为2ms和6ms;在打开-O2优化后,两者均为1ms。这种通过减少循环次数的方法在GLIBC中也有体现,比如说strncpy的实现:

下面是strncpy的GLIBC源码:
char *
x_strncpy (s1, s2, n)
        char *s1;
        const char *s2;
        size_t n;
{
        reg_char c;
        char *s = s1;

        –s1;

        if (n >= 4)
        {
                size_t n4 = n >> 2; /* n4 = n / 4, n4表示下面的循环执行的次数*/

                for (;;)
                {
                        c = *s2++;
                        *++s1 = c;
                        if (c == '')
                                break;
                        c = *s2++;
                        *++s1 = c;
                        if (c == '')
                                break;
                        c = *s2++;
                        *++s1 = c;
                        if (c == '')
                                break;
                        c = *s2++;
                        *++s1 = c;
                        if (c == '')
                                break;
                        if (–n4 == 0)
                                goto last_chars;  /* 如果n = 10,s2 = "hello world",则两轮循环后,还有"尾巴"没有copy完,在last_chars处继续处理 */
                }
                n = n – (s1 – s) – 1;  /* 还没有copy完n个字节,s2就到达末尾了,跳到zero_fill处继续为s1补零 */
                if (n == 0)
       return s;
                goto zero_fill;
        }

last_chars:     
        n &= 3;       /* n = n & 3 结果 n <= 3,n即为上面循环过后"尾巴字符"的数量 */
        if (n == 0)
                return s;
        do
        {
                c = *s2++;
                *++s1 = c;
                if (–n == 0)
                        return s;
        } while (c != '');

zero_fill:       
        do
                *++s1 = '';
        while (–n > 0);

        return s;
}

相比于strlen的实现,strncpy的实现更易理解。其字面上的逻辑就是每四个字节(n>>2)作为一组,每组逐个字节进行拷贝赋值,其内在目的则是减少循环次数,以获得性能的提升。要想知道为什么减少循环次数能提升性能的话,那就要深入到汇编层面去了,这里不再详述。另外还要一提的是GLIBC中的strncmp,strncat的实现也遵循着与上面同样的逻辑。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats