AS3:计算当前上传速度(或吞吐量)

时间:2010-06-28 20:55:25

标签: actionscript-3 upload performance throughput

我使用FileReference类的upload()方法上传文件。我想显示当前的连接速度,我想知道这是一个很好的方法。

我目前的技术是每1毫秒使用一个定时器,如下所示:

var speed:Function = function(event:TimerEvent):void {
    speed = Math.round((currentBytes - lastBytes) / 1024);
    lastBytes = currentBytes;
}
var speedTimer:Timer = new Timer(1000);
speedTimer.addEventListener(TimerEvent.TIMER, uploadSpeed);

和currentBytes被设置到ProgressEvent.PROGRESS中。这种技术似乎不精确。我想知道在上传和实时显示上传速度时我可以用什么方法来计算上传速度。

欢迎任何想法或意见!

非常感谢,

鲁迪

2 个答案:

答案 0 :(得分:0)

您可以监控服务器上的上传速度,然后将该数据发送回客户端。此技术通常用于ajax文件上载表单。

答案 1 :(得分:0)

如果该代码块是复制并粘贴它肯定不会像您预期的那样工作。您将speed声明为一个函数,您可以在其中将其重新定义为数字。我很欣赏Flash IDE,你可以使用粗略的语法,但是这样的代码会让你遇到各种各样的麻烦。在编写代码时尽量明确。

尝试这样的操作,将yourLoader替换为您分配给上传者的标识符:

private var speed:Number = 0;
private var lastBytes:uint = 0;

private function uploadSpeed(event:TimerEvent):void
{
   speed = Math.round((yourLoader.currentBytes - lastBytes) / 1024);
   lastBytes = yourLoader.currentBytes;
}

private var speedTimer:Timer = new Timer(1000);
speedTimer.addEventListener(TimerEvent.TIMER, uploadSpeed);

这应该计算以 1秒间隔移动的字节数。

编辑:

您可能希望将间隔设置为小于1000毫秒,并计算上次 n 样本的平均速度。这将使您的用户看到的数字看起来比现在可能更稳定。将速度设为最新样本Array.push()。使用.shift()删除最旧的样本,这样您就不会失去太多精确度。通过试验和错误,您可以更好地了解要保留多少样品以及使用多少样品。