जावास्क्रिप्ट में इंटरनेट की गति का पता लगाने के लिए कैसे?


213

मैं एक जावास्क्रिप्ट पृष्ठ कैसे बना सकता हूं जो उपयोगकर्ता की इंटरनेट गति का पता लगाएगा और उसे पृष्ठ पर दिखाएगा? कुछ इस तरह से “आपकी इंटरनेट स्पीड है ?? / ?? Kb / s ”


1
@ जैकब, @ एंकिट: लोग इसके लिए फ्लैश का उपयोग कर सकते हैं, लेकिन आपको इसकी आवश्यकता नहीं है। जो भी कारण हो आप इसे जावास्क्रिप्ट के साथ नहीं कर सकते।
टीजे क्राउडर

यह वही है जो आपको चाहिए: speedof.me/api.html
advncd

जवाबों:


287

यह कुछ हद तक संभव है, लेकिन वास्तव में सटीक नहीं होगा, विचार एक ज्ञात फ़ाइल आकार के साथ लोड छवि है, फिर इसके onloadघटना माप में उस घटना को ट्रिगर होने तक कितना समय बीत गया, और इस बार छवि फ़ाइल आकार में विभाजित करें।

उदाहरण यहां पाया जा सकता है: जावास्क्रिप्ट का उपयोग करके गति की गणना करें

निर्धारित सुझाव को लागू करने वाला टेस्ट केस:

//JUST AN EXAMPLE, PLEASE USE YOUR OWN PICTURE!
var imageAddr = "http://www.kenrockwell.com/contax/images/g2/examples/31120037-5mb.jpg"; 
var downloadSize = 4995374; //bytes

function ShowProgressMessage(msg) {
    if (console) {
        if (typeof msg == "string") {
            console.log(msg);
        } else {
            for (var i = 0; i < msg.length; i++) {
                console.log(msg[i]);
            }
        }
    }
    
    var oProgress = document.getElementById("progress");
    if (oProgress) {
        var actualHTML = (typeof msg == "string") ? msg : msg.join("<br />");
        oProgress.innerHTML = actualHTML;
    }
}

function InitiateSpeedDetection() {
    ShowProgressMessage("Loading the image, please wait...");
    window.setTimeout(MeasureConnectionSpeed, 1);
};    

if (window.addEventListener) {
    window.addEventListener('load', InitiateSpeedDetection, false);
} else if (window.attachEvent) {
    window.attachEvent('onload', InitiateSpeedDetection);
}

function MeasureConnectionSpeed() {
    var startTime, endTime;
    var download = new Image();
    download.onload = function () {
        endTime = (new Date()).getTime();
        showResults();
    }
    
    download.onerror = function (err, msg) {
        ShowProgressMessage("Invalid image, or error downloading");
    }
    
    startTime = (new Date()).getTime();
    var cacheBuster = "?nnn=" + startTime;
    download.src = imageAddr + cacheBuster;
    
    function showResults() {
        var duration = (endTime - startTime) / 1000;
        var bitsLoaded = downloadSize * 8;
        var speedBps = (bitsLoaded / duration).toFixed(2);
        var speedKbps = (speedBps / 1024).toFixed(2);
        var speedMbps = (speedKbps / 1024).toFixed(2);
        ShowProgressMessage([
            "Your connection speed is:", 
            speedBps + " bps", 
            speedKbps + " kbps", 
            speedMbps + " Mbps"
        ]);
    }
}
<h1 id="progress">JavaScript is turned off, or your browser is realllllly slow</h1>

"वास्तविक" गति परीक्षण सेवा के साथ त्वरित तुलना में बड़ी तस्वीर का उपयोग करते समय 0.12 एमबीपीएस का छोटा अंतर दिखाया गया।

परीक्षण की अखंडता सुनिश्चित करने के लिए, आप क्रोम देव टूल थ्रॉटलिंग सक्षम के साथ कोड चला सकते हैं और फिर देख सकते हैं कि परिणाम सीमा से मेल खाता है या नहीं। (श्रेय user284130 :) को जाता है )

ध्यान रखने योग्य महत्वपूर्ण बातें:

  1. उपयोग की जा रही छवि को ठीक से अनुकूलित और संपीड़ित होना चाहिए। यदि ऐसा नहीं है, तो वेब सर्वर द्वारा कनेक्शन पर डिफ़ॉल्ट संपीड़न वास्तव में गति से बड़ा हो सकता है। एक अन्य विकल्प असंपीड़ित फ़ाइल प्रारूप का उपयोग कर रहा है, जैसे कि jpg। ( यह याद दिलाने के लिए राउली राजन्दे और मुझे याद दिलाने के लिए फ्लक्साइन धन्यवाद )

  2. ऊपर वर्णित कैश बस्टर तंत्र कुछ CDN सर्वर के साथ काम नहीं कर सकता है, जिसे क्वेरी स्ट्रिंग मापदंडों की अनदेखी करने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए छवि पर ही कैश कंट्रोल हेडर को बेहतर तरीके से सेट किया जा सकता है। (धन्यवाद के लिए orcaman इस ओर इशारा करते हुए ) )


8
ध्यान रखें कि परीक्षण छवि ठीक से अनुकूलित और संकुचित है। यदि ऐसा नहीं है, तो वेबसर्वर द्वारा कनेक्शनों पर डिफ़ॉल्ट संपीड़न वास्तव में की तुलना में बड़ी गति दिखा सकता है।
रौली राजेंडे

3
मुझे यह सुनिश्चित करने के लिए थोड़ी सी चाल मिली कि आपकी छवि परीक्षण के लिए उपयुक्त है: क्रोम देव टूल थ्रॉटलिंग सक्षम के साथ कोड चलाएं, और देखें कि क्या परिणाम सीमा से मेल खाता है। आशा है कि यह किसी की मदद कर सकता है।
user284130

3
राउली राजंडे में शामिल होना: एक ऐसी फ़ाइल का बेहतर उपयोग करना जो असंगत (या लगभग) हो, या वेबसर्वर कम्प्रेशन मॉड्यूल इसे कम कर सकता है, माप को अमान्य कर सकता है। एक jpeg छवि एक अच्छा विकल्प होगा।
फ्लक्सिन

1
उन लोगों के लिए जिन्होंने इस जावास्क्रिप्ट कोड का सफलतापूर्वक उपयोग किया है, क्या आपने शुरू में "download.onload" पर कोई कॉल नहीं किया है? यह वही है जो मैं अनुभव कर रहा हूं और मैं अभी भी यह जानने की कोशिश कर रहा हूं कि क्यों।

2
@ छोटी छवि का मतलब कम सटीक परीक्षण है, यह उद्देश्य पर बड़ा है। :)
शैडो विजार्ड ईयर फॉर यू

78

खैर, यह 2017 है इसलिए अब आपके पास नेटवर्क सूचना एपीआई है (अब तक के ब्राउज़रों में एक सीमित समर्थन के साथ) कुछ प्रकार के अनुमान डाउनलिंक स्पीड जानकारी प्राप्त करने के लिए :

navigator.connection.downlink

यह प्रति सेकंड Mbits में प्रभावी बैंडविड्थ का अनुमान है। ब्राउज़र हाल ही में देखे गए सक्रिय कनेक्शन के माध्यम से हाल ही में देखी गई एप्लिकेशन परत थ्रूपुट से यह अनुमान लगाता है। कहने की जरूरत नहीं है, इस दृष्टिकोण का सबसे बड़ा लाभ यह है कि आपको बैंडविड्थ / गति गणना के लिए किसी भी सामग्री को डाउनलोड करने की आवश्यकता नहीं है।

आप इसे और कुछ अन्य संबंधित विशेषताओं को यहाँ देख सकते हैं

यह ब्राउज़रों में सीमित समर्थन और विभिन्न कार्यान्वयन है करने के लिए (नवंबर 2017) के रूप में, दृढ़ता से सिफारिश करेंगे कारण पढ़ इस विस्तार से


18
यह कैन आई यूज़ में बहुत लाल है!
फ्रांसिस्को प्रेसेंशिया

2
मुझे इसके इस्तेमाल से 10MBit से अधिक संख्या नहीं मिलती है। क्या कोई सीमा है?
तोबी

@ तोबी मैं भी 10MBit से अधिक नहीं लगता, 100 एमबीटी से अधिक होना चाहिए
camjocotem

वास्तव में डाउनलिंक क्या है? क्या यह डाउनलोड गति या कुछ और है?
gacat

@ तोबी मी न, अगर गति 10Mb से अधिक है तो मैं 10 पढ़ता हूं
Aramil

21

जैसा कि मैं StackOverflow पर यहां इस अन्य उत्तर में रूपरेखा करता हूं , आप विभिन्न आकारों की फ़ाइलों के डाउनलोड को समय से कर सकते हैं (छोटे शुरू करें, अगर यह अनुमति देने के लिए लगता है तो रैंप करें), कैश हेडर के माध्यम से सुनिश्चित करना और इस तरह से फ़ाइल वास्तव में है दूरस्थ सर्वर से पढ़ा जा रहा है और कैश से पुनर्प्राप्त नहीं किया जा रहा है। इसके लिए जरूरी नहीं है कि आपके पास खुद का सर्वर हो (फाइलें S3 या इसी तरह की हो सकती हैं ), लेकिन कनेक्शन गति का परीक्षण करने के लिए आपको फाइलों को प्राप्त करने के लिए कहीं न कहीं जरूरत होगी।

कहा कि, समय-समय पर बैंडविड्थ परीक्षण बहुत ही अविश्वसनीय रूप से अविश्वसनीय हैं, जैसा कि वे अन्य खिड़कियों में डाउनलोड की जा रही अन्य वस्तुओं से प्रभावित होते हैं, आपके सर्वर की गति, लिंक मार्ग, आदि।, लेकिन आप एक मोटा विचार प्राप्त कर सकते हैं। इस तरह की तकनीक का उपयोग करना।


1
@ जैकब: आपके पास अपलोड करने के लिए एक जगह होनी चाहिए, लेकिन कोई कारण नहीं है कि आप उसी तकनीक का उपयोग नहीं कर सकते। आप अपने द्वारा डाउनलोड किए गए डेटा का उपयोग कर सकते हैं या, निश्चित रूप से, आप डाउनलोड परीक्षण के लिए डाउनलोड किए गए कुछ डेटा का फिर से उपयोग कर सकते हैं।
TJ Crowder

तो आपको कैसे पता चलेगा कि अपलोड कब पूरा हुआ?
जकूब हैम्पल

2
@ याकूब: कई तरीकों में से कोई भी। यदि आप iframeउदाहरण के लिए, किसी छिपे हुए को सबमिट करते हैं , तो आप iframeपूर्ण होने के लिए या कुकी को पोल करते हैं । यदि आप XMLHttpRequestपोस्ट करने के लिए किसी ऑब्जेक्ट का उपयोग करते हैं, तो पूरा होने के लिए कॉलबैक है।
टीजे क्राउडर

17

मुझे यह निर्धारित करने के लिए एक त्वरित तरीके की आवश्यकता थी कि क्या उपयोगकर्ता कनेक्शन की गति इतनी तेज़ थी कि मैं जिस साइट पर काम कर रहा हूं, उसमें कुछ सुविधाओं को सक्षम / अक्षम कर सकता हूं, मैंने यह एक छोटी सी स्क्रिप्ट बनाई है, जिसमें एक एकल (छोटी) छवि डाउनलोड करने में लगने वाले समय का औसत कई बार, यह मेरे परीक्षणों में बहुत सटीक रूप से काम कर रहा है, उदाहरण के लिए 3 जी या वाई-फाई के बीच स्पष्ट रूप से भेद करने में सक्षम है, शायद कोई और अधिक सुरुचिपूर्ण संस्करण या यहां तक ​​कि एक jQuery प्लगइन बना सकता है।

var arrTimes = [];
var i = 0; // start
var timesToTest = 5;
var tThreshold = 150; //ms
var testImage = "http://www.google.com/images/phd/px.gif"; // small image in your server
var dummyImage = new Image();
var isConnectedFast = false;

testLatency(function(avg){
  isConnectedFast = (avg <= tThreshold);
  /** output */
  document.body.appendChild(
    document.createTextNode("Time: " + (avg.toFixed(2)) + "ms - isConnectedFast? " + isConnectedFast)
  );
});

/** test and average time took to download image from server, called recursively timesToTest times */
function testLatency(cb) {
  var tStart = new Date().getTime();
  if (i<timesToTest-1) {
    dummyImage.src = testImage + '?t=' + tStart;
    dummyImage.onload = function() {
      var tEnd = new Date().getTime();
      var tTimeTook = tEnd-tStart;
      arrTimes[i] = tTimeTook;
      testLatency(cb);
      i++;
    };
  } else {
    /** calculate average of array items then callback */
    var sum = arrTimes.reduce(function(a, b) { return a + b; });
    var avg = sum / arrTimes.length;
    cb(avg);
  }
}


1
सबसे विश्वसनीय जवाब, मेरे मामले में।
अब्दुल्ला अरबब

1
अपलोडिंग टेस्ट के बारे में क्या?
गुमराह

9

छवि की चाल शांत है, लेकिन मेरे परीक्षण में यह लोड हो रहा था इससे पहले कि कुछ अजाक्स कॉल मैं पूरा होना चाहता था।

2017 में उचित समाधान एक कार्यकर्ता ( http://caniuse.com/#feat=webworkers ) का उपयोग करना है ।

कार्यकर्ता ऐसा दिखेगा:

/**
 * This function performs a synchronous request
 * and returns an object contain informations about the download
 * time and size
 */
function measure(filename) {
  var xhr = new XMLHttpRequest();
  var measure = {};
  xhr.open("GET", filename + '?' + (new Date()).getTime(), false);
  measure.start = (new Date()).getTime();
  xhr.send(null);
  measure.end = (new Date()).getTime();
  measure.len = parseInt(xhr.getResponseHeader('Content-Length') || 0);
  measure.delta = measure.end - measure.start;
  return measure;
}

/**
 * Requires that we pass a base url to the worker
 * The worker will measure the download time needed to get
 * a ~0KB and a 100KB.
 * It will return a string that serializes this informations as
 * pipe separated values
 */
onmessage = function(e) {
  measure0 = measure(e.data.base_url + '/test/0.bz2');
  measure100 = measure(e.data.base_url + '/test/100K.bz2');
  postMessage(
    measure0.delta + '|' +
    measure0.len + '|' +
    measure100.delta + '|' +
    measure100.len
  );
};

जेएस फ़ाइल जो कार्यकर्ता को आमंत्रित करेगी:

var base_url = PORTAL_URL + '/++plone++experimental.bwtools';
if (typeof(Worker) === 'undefined') {
  return; // unsupported
}
w = new Worker(base_url + "/scripts/worker.js");
w.postMessage({
  base_url: base_url
});
w.onmessage = function(event) {
  if (event.data) {
    set_cookie(event.data);
  }
};

मेरे द्वारा लिखे गए एक पैकेज से लिया गया कोड:


5

गति का परीक्षण करने के लिए छवियों का उपयोग करना बेहतर है। लेकिन अगर आपको ज़िप फ़ाइलों से निपटना है, तो नीचे दिया गया कोड काम करता है।

var fileURL = "your/url/here/testfile.zip";

var request = new XMLHttpRequest();
var avoidCache = "?avoidcache=" + (new Date()).getTime();;
request.open('GET', fileURL + avoidCache, true);
request.responseType = "application/zip";
var startTime = (new Date()).getTime();
var endTime = startTime;
request.onreadystatechange = function () {
    if (request.readyState == 2)
    {
        //ready state 2 is when the request is sent
        startTime = (new Date().getTime());
    }
    if (request.readyState == 4)
    {
        endTime = (new Date()).getTime();
        var downloadSize = request.responseText.length;
        var time = (endTime - startTime) / 1000;
        var sizeInBits = downloadSize * 8;
        var speed = ((sizeInBits / time) / (1024 * 1024)).toFixed(2);
        console.log(downloadSize, time, speed);
    }
}

request.send();

यह फ़ाइलों के साथ बहुत अच्छी तरह से काम नहीं करेगा <10MB। आपको एकाधिक डाउनलोड प्रयासों पर समेकित परिणाम चलाना होगा।


3
वास्तव में इस सवाल का जवाब की सादगी की तरह मैं और मैं अपने उद्देश्य के लिए अनुकूलित किया है: मैं करने के लिए बदली window.performance.now टाइम स्टांप, के लिए request.responseType = "ब्लॉब" (MIME प्रकार मान्य नहीं हैं), request.response.size के लिए डाउनलोड आकार, और गति गणना के लिए 1000000 (क्योंकि एमबीपीएस एसआई इकाइयों में होना चाहिए)।
रूपर्ट रॉन्स्ले

3

मुझे कुछ इसी तरह की जरूरत थी, इसलिए मैंने https://github.com/beradrian/jsbandwidth लिखा । यह https://code.google.com/p/jsbandwidth/ का पुनर्लेखन है ।

यह विचार अजाक्स के माध्यम से दो कॉल करने के लिए है, एक डाउनलोड करने के लिए और दूसरा पोस्ट के माध्यम से अपलोड करने के लिए।

यह दोनों jQuery.ajaxया कोणीय के साथ काम करना चाहिए $http


1

पुनीत एस जवाब के लिए धन्यवाद, गतिशील कनेक्शन गति परिवर्तन का पता लगाने के लिए, आप निम्न कोड का उपयोग कर सकते हैं:

navigator.connection.onchange = function () {
 //do what you need to do ,on speed change event
 console.log('Connection Speed Changed');
}

2
दुर्भाग्य से यह सभी ब्राउज़रों का समर्थन नहीं करता है। caniuse.com/#search=netinfo
axelioo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.