【问题标题】:AS3: Calculating the current upload speed (or throughput)AS3:计算当前上传速度(或吞吐量)
【发布时间】:2010-06-28 20:55:24
【问题描述】:

我正在使用 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 中。这种技术似乎不精确。我想知道在上传和实时显示的同时,我还可以使用哪些其他方法来计算上传速度。

欢迎任何想法或意见!

非常感谢,

鲁迪

【问题讨论】:

    标签: actionscript-3 upload performance throughput


    【解决方案1】:

    如果该代码块是复制和粘贴,它肯定不会像您预期的那样工作。您将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() 删除最旧的样本,这样您就不会损失太多的准确性。反复试验会让您更好地了解要保存多少样本以及多久采集一次。

    【讨论】:

    • 那不是每行复制粘贴,我这里尝试快速重写,并设置了两次名称“速度”。在我的程序中不是这样,但是很好,谢谢。我喜欢数组的想法并推送元素并仅计算 n 个样本的平均值。它会让它更稳定(虽然突然下降或速度增加需要一些时间来反映),但它仍然是一个更好的解决方案。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 好的,谢谢。如果我只能使用客户端,请问客户端有什么好的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2012-11-22
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2017-05-07
    相关资源
    最近更新 更多