Я бы хотел получить приблизительную оценку скорости загрузки пользователей без прямого разрешения. Это только для того, чтобы отличать действительно медленные соединения от очень быстрых, поэтому точность не очень важна...
Оценить скорость загрузки пользователей без прямого разрешения
Ответ 1
Здесь реализована реализация этого с использованием XMLHttpRequest
, расширяющегося по идее @Yiğit Yener.
Скорость загрузки зависит от двух факторов: скорости подключения пользователя и скорости подключения к серверу. Я сделал предположение, что вы хотите проверить скорость между пользователем и вашим сервером. И с XMLHttpRequest
, это действительно единственный вариант из-за политики одного и того же происхождения.
С скоростью загрузки вам не нужно ничего возвращать. Вам просто нужно POST
большой фрагмент данных на любую страницу вашего сервера. Самая легкая страница, на которую нужно попасть, - это та, на которой вы уже находитесь. Для этого вы можете полностью оставить часть домена в URL-адресе .open()
. POST
данные ограничены на некоторых серверах до двух мегабайт, поэтому я использовал их для обеспечения безопасности. Одного достаточно, чтобы получить достойное чтение.
Чтобы предотвратить кэширование URL-адреса, я добавляю случайное число до конца.
url = '?cache=' + Math.floor( Math.random() * 10000 )
Чтобы предотвратить передачу данных POST
, я использую случайные данные. Функция позволяет передавать количество итераций, которые вы хотите проверить. Итерации разнесены каждые пять секунд. Обратный вызов update
вызывается каждой итерацией со скоростью этой проверки и скользящим средним всех проверок. Используйте столько итераций, сколько хотите получить желаемую точность. Если вам просто нужна приблизительная оценка, достаточно одной итерации.
Он называется так:
checkUploadSpeed( 10, function ( speed, average ) {
} );
Demos
Здесь вы можете попробовать этот код.
Частный сервер
Вы можете попробовать это на собственный сервер ThinkingStiff, который, вероятно, является самым быстрым из всех.
Фрагмент стека
function checkUploadSpeed( iterations, update ) {
var average = 0,
index = 0,
timer = window.setInterval( check, 5000 ); //check every 5 seconds
check();
function check() {
var xhr = new XMLHttpRequest(),
url = '?cache=' + Math.floor( Math.random() * 10000 ), //random number prevents url caching
data = getRandomString( 1 ), //1 meg POST size handled by all servers
startTime,
speed = 0;
xhr.onreadystatechange = function ( event ) {
if( xhr.readyState == 4 ) {
speed = Math.round( 1024 / ( ( new Date() - startTime ) / 1000 ) );
average == 0
? average = speed
: average = Math.round( ( average + speed ) / 2 );
update( speed, average );
index++;
if( index == iterations ) {
window.clearInterval( timer );
};
};
};
xhr.open( 'POST', url, true );
startTime = new Date();
xhr.send( data );
};
function getRandomString( sizeInMb ) {
var chars = "A[email protected]#$%^&*()_+`-=[]\{}|;':,./<>?", //random data prevents gzip effect
iterations = sizeInMb * 1024 * 1024, //get byte count
result = '';
for( var index = 0; index < iterations; index++ ) {
result += chars.charAt( Math.floor( Math.random() * chars.length ) );
};
return result;
};
};
checkUploadSpeed( 10, function ( speed, average ) {
document.getElementById( 'speed' ).textContent = 'speed: ' + speed + 'kbs';
document.getElementById( 'average' ).textContent = 'average: ' + average + 'kbs';
} );
<div id="speed">speed: 0kbs</div>
<div id="average">average: 0kbs</div>
Ответ 2
Вы можете сделать асинхронный запрос ajax для службы, которая отправляет/возвращает большой объем данных и измеряет время, которое требуется для загрузки клиентом. На это, конечно же, влияет текущее использование сети клиентами.
Ответ 3
Один из способов сделать это, который приходит на ум, - создать iframe
с form
с textarea
в нем, заполнить textarea
большим количеством случайных символов, а затем программно отправить форма. Попросите ответ на отправку в родительское окно, чтобы сказать, когда оно будет завершено, и измерьте время от подачи до завершения. Вы можете начать с относительно небольшой полезной нагрузки (так что это не займет много времени на медленном соединении), и если это произойдет очень быстро, повторите все более большие нагрузки до тех пор, пока вы не будете довольны результатом. Точно так же можно было бы сделать с ajax, я полагаю, не уверен, почему я сразу подумал о iframe
. См. мой другой ответ здесь, в разделе "Переполнение стека", но подумайте о более широких формах данных вместо данных загрузки.
Это даст вам очень грубую меру скорости загрузки.