Javascript 估计用户数';未经直接许可上传速度

Javascript 估计用户数';未经直接许可上传速度,javascript,ajax,html,performance,file-upload,Javascript,Ajax,Html,Performance,File Upload,我想在没有获得直接许可的情况下粗略估计一下用户的上传速度。这只是为了区分非常慢的连接和非常快的连接,因此准确性不是特别重要…您可以向发送/返回大量数据的服务发出异步ajax请求,并测量客户端加载所需的时间。这当然会受到客户端当前网络使用情况的影响。想到的一种方法是使用表单创建iframe,表单中包含textarea,用大量随机字符填充textarea,然后以编程方式提交表单。将提交响应调用到父窗口,说明何时完成,并测量从提交到完成的时间。您可以从一个相对较小的负载开始(因此,在一个缓慢的连接上不

我想在没有获得直接许可的情况下粗略估计一下用户的上传速度。这只是为了区分非常慢的连接和非常快的连接,因此准确性不是特别重要…

您可以向发送/返回大量数据的服务发出异步ajax请求,并测量客户端加载所需的时间。这当然会受到客户端当前网络使用情况的影响。

想到的一种方法是使用
表单创建
iframe
,表单中包含
textarea
,用大量随机字符填充
textarea
,然后以编程方式提交表单。将提交响应调用到父窗口,说明何时完成,并测量从提交到完成的时间。您可以从一个相对较小的负载开始(因此,在一个缓慢的连接上不需要花费很长时间),如果这个负载很快恢复,那么重复使用越来越大的负载,直到您对结果满意为止。我想,ajax也可以做同样的事情,我不知道为什么我会马上想到
iframe
。请参阅这里的堆栈溢出,但请考虑越来越大的表单数据,而不是下载数据


这将为您提供一个非常粗略的上传速度度量。

下面是一个使用
XMLHttpRequest
扩展idea的实现

上传速度取决于两个因素:用户的连接速度和服务器的连接速度。我在这里假设您想要测试用户和服务器之间的速度。对于
XMLHttpRequest
,这实际上是唯一的选择,因为

使用上传速度,您无需返回任何内容。您只需
将大量数据发布到服务器上的任何页面即可。最容易点击的页面是你已经在上面的页面。要做到这一点,您可以在
.open()
中完全保留url的域部分
POST
数据在某些服务器上被限制为2兆字节,所以为了安全起见,我使用了一个。一本就足够让你读一本像样的书了

为了防止URL被缓存,我在末尾附加了一个随机数

url='?cache='+Math.floor(Math.random()*10000)
为了防止
POST
数据被gzip压缩,我使用了随机数据。该函数允许您传递希望检查的迭代次数。迭代间隔为每5秒。每次迭代调用
update
回调时,都会使用该检查的速度和所有检查的移动平均值。使用尽可能多的迭代以获得所需的精度。如果你只是想要一个粗略的估计,一次迭代就足够了

它的名字是这样的:

检查上传速度(10,功能(速度,平均值){
} );

演示 您可以在此处尝试此代码

专用服务器 你可以试穿一下,这可能是最快的

堆栈片段
函数检查上传速度(迭代、更新){
var平均值=0,
指数=0,
timer=window.setInterval(检查,5000);//每5秒检查一次
检查();
函数检查(){
var xhr=new XMLHttpRequest(),
url='?缓存='+Math.floor(Math.random()*10000),//随机数阻止url缓存
data=getRandomString(1),//所有服务器处理的1兆POST大小
开始的时候,
速度=0;
xhr.onreadystatechange=函数(事件){
if(xhr.readyState==4){
速度=数学圆(1024/((新日期()-startTime)/1000));
平均值==0
?平均值=速度
:平均=数学圆((平均+速度)/2);
更新(速度、平均值);
索引++;
如果(索引==迭代次数){
窗口清除间隔(计时器);
};
};
};
xhr.open('POST',url,true);
开始时间=新日期();
发送(数据);
};
函数getRandomString(sizeInMb){
var chars=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789~!@$%^&*():,,./?,//随机数据防止gzip效应
迭代次数=sizeInMb*1024*1024,//获取字节计数
结果='';
对于(var索引=0;索引<迭代次数;索引++){
结果+=chars.charAt(Math.floor(Math.random()*chars.length));
};     
返回结果;
};
};
检查上传速度(10,功能(速度,平均值){
document.getElementById('speed').textContent='speed:'+speed+'kbs';
document.getElementById('average').textContent='average:'+average+'kbs';
} );
速度:0kbs

平均值:0kbs
我喜欢这个解决方案,我正在考虑改进它的方法。。。thinkingstiff服务器显示我的速度为800 kbs,JSFIDLE显示我的速度为4 Mb/s,而Speedtest显示我的上传速度为50 Mb/s。我喜欢这个解决方案,我想使用它,但我得到的结果与Speedtest.net或testmy.net等有很大不同。测试站点之间似乎并不太一致,但是我用这个js代码进行的测试肯定是异常值。有什么想法吗?@Emerson您看到的速度取决于服务器的连接,在本例中是JSFIDLE。尝试thinkingstiff链接,它位于更快的服务器上。Speedtest有一个巨大的连接,试图比你的连接速度更快。如果jsFiddle链接显示较慢的速度,那是因为它们的连接速度比你的慢。@请参阅我对艾默生的评论。“为了防止POST数据被gzip压缩,