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
永久链接:https://jijian91.com/blog20071016/gmail-capacity-algorithm.html