Gmail容量增长算法分析

2007/10/16 17:39  

最近,Google确认了Gmail免费容量增速加快的消息。Gmail主页上那个不断增加数字又引起了大家的兴趣。很多人问是怎么实现的?

我也曾经想过这个问题。全世界有众多的Gmail用户,数字是1秒钟变化1次,如果都从服务器获取数据,访问量将是个天文数字。后来,看了代码才知道,其实非常简单,就是一小段javascript。

查看Gmail首页的源码,容量数字是显示在id为quota的span中。再看,在head段的script中,可以看到OnLoad函数,其中调用了updateQuota函数。正是由updateQuota函数完成定时更新容量数字的功能,具体步骤是:

  • 获取当前客户端时间now
  • 前面已经定义了2维数组CP,其每个元素都是有2个元素组成的1维数组。2个元素分别是时间值(从1970年以来的毫秒数)和容量值(单位是M)。从前向后遍历CP,找到第1个时间比now大的1维数组。
  • 如果找到,取此1维数组和前1个1维数组中的时间值和容量值,列成容量与时间的2元1次线性方程。代入now,得到相应的容量值并显示。
  • 建立定时器,1秒钟后重复执行本函数。

由此可见,Gmail的容量增加完全取决于数组CP的数据。Google用了”最没有技术含量的方法”解决了容量显示问题,这就是所谓工程师的方法

本文题目是Gmail容量是数字游戏,只是说Google的容量显示的算法,并不是说这个数字是虚幻的。我就曾用到了Gmail总容量的98%,不过没有试是否能够超过限制。按照Google的风格,实际的容量限制可能比显示的大。

Gmail目前的容量数据是:
2007年4月1日 16:00(北京时间,下同) ——2835M
2007年10月12日 16:00——2912M
2007年10月23日 15:00——4321M
2008年1月4日 16:00——6283M
2038年1月17日 16:00——43008M
3456年1月2日 15:00——能表示的最大数值,也就是1.7976931348623157e+308

当然,最后2行纯属玩笑。我们还记得今年1月2日,Gmail容量停止增加。当时,我们猜想了种种原因。其实,很可能就象Google后来说的,是工程师忘了按时加1行数据。Gmail是按当前计算机的时间显示容量,所以改变时间,可以看到Gmail未来和过去的容量。

相关源码如下:

// Estimates of nanite storage generation over time.

var CP = [

 [ 1175414400000, 2835 ],

 [ 1192176000000, 2912 ],

 [ 1193122800000, 4321 ],

 [ 1199433600000, 6283 ],

 [ 2147328000000, 43008 ],

 [ 46893711600000, Number.MAX_VALUE ]

];

var quota;

function OnLoad() {

    gaia_setFocus();

    MaybePingUser();

    el("gaia_loginform").Passwd.onfocus = MaybePingUser;

    LogRoundtripTime();

    if (!quota) {

        quota = el("quota");

        updateQuota();

    }

     LoadConversionScript();

}

function updateQuota() {

    if (!quota) {

        return;

    }

    var now = (new Date()).getTime();

    var i;

    for (i = 0; i < CP.length; i++) {

        if (now < CP[i][0]) {

            break;

        }

    }

    if (i == 0) {

        setTimeout(updateQuota, 1000);

    } else if (i == CP.length) {

        quota.innerHTML = CP[i - 1][1];

    } else {

        var ts = CP[i - 1][0];

        var bs = CP[i - 1][1];

        quota.innerHTML = format(((now-ts) / (CP[i][0]-ts) * (CP[i][1]-bs)) + bs);

        setTimeout(updateQuota, 1000);

    }

}

转载请注明来自:jijian91与小z - google

永久链接:http://jijian91.com/blog20071016/gmail-capacity-algorithm.html