Оценить скорость загрузки пользователей без прямого разрешения

Я бы хотел получить приблизительную оценку скорости загрузки пользователей без прямого разрешения. Это только для того, чтобы отличать действительно медленные соединения от очень быстрых, поэтому точность не очень важна...

Ответ 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. См. мой другой ответ здесь, в разделе "Переполнение стека", но подумайте о более широких формах данных вместо данных загрузки.

Это даст вам очень грубую меру скорости загрузки.