Skip to content

Instantly share code, notes, and snippets.

@nim579
Created January 27, 2014 08:28
Show Gist options
  • Save nim579/8644878 to your computer and use it in GitHub Desktop.
Save nim579/8644878 to your computer and use it in GitHub Desktop.
Measure client network connection speed

measureSpeed

Measure client network connection speed

Usage

Upload the gif image (1 Mb) on your server.

Like deferred object

clientSpeed = new measureSpeed()
clientSpeed.done (speed)->
    console.log speed

With callbacks

#Called when the speed test done
speed = (speedResuts)->
    console.log speedResuts

#Called when speed test attempt done
attempt = (attemptResults)->
    console.log attemptResults

new measureSpeed(speed, attempt)

Callbacks

Done callback fields

{
    "speed": [                      //All attempts results
        {
        "bs": 6636556.962025316,    //Bits per second
        "delta": 158,               //The image is loading (milliseconds)
	    "mbps": 6.329113924050633,  //Megabytes per second
	    "mbs": 50.63291139240506    //Megabits per second
	    },
	    {"bs": 6636556.962025316, "delta": 158, "mbps": 6.329113924050633, "mbs": 50.63291139240506}
    ],
    "average": {
        "bs": 6636556.962025316,
        "delta": 158,
	    "mbps": 6.329113924050633,
	    "mbs": 50.63291139240506
    }
}

Attempt callback fields

{
    "attempts": 1,                  //Made attempts
    "attemptsPercent": 0.2,         //Measuring progress (percents)
    "average": {                    //Intermediate average results
        "bs": 6636556.962025316,
        "delta": 158,
	    "mbps": 6.329113924050633,
	    "mbs": 50.63291139240506
    },
    "speed": {                      //Attempt results
        "bs": 6636556.962025316,
        "delta": 158,
	    "mbps": 6.329113924050633,
	    "mbs": 50.63291139240506
    }
}
class measureSpeed
measureAttempts: 5
constructor: (done, process)->
measureProcess = new $.Deferred()
measurements = []
attempts = 0
average =
mbps: 0
mbs: 0
bs: 0
delta: 0
measureProcess.progress (data)=>
attempts++
speed =
delta: data.delta
bs: data.bs
mbps: data.bs / (1024*1024)
mbs: (data.bs / (1024*1024)) * 8
#Add new measurement
measurements.push speed
#Set first measurement like average
if attempts <= 1
average = _.extend {}, speed
else
#Calculate sum of all measurements
measurementsSumm = _.reduce measurements, (measurement, summ)->
newSumm =
delta: summ.delta + measurement.delta
bs: summ.bs + measurement.bs
mbps: summ.mbps + measurement.mbps
mbs: summ.mbs + measurement.mbs
return newSumm
#Compute the average value of the current measurement
for field of measurementsSumm
average[field] = measurementsSumm[field]/attempts
process?({speed: speed, average: average, attempts: attempts, attemptsPercent: attempts/@measureAttempts})
if attempts >= @measureAttempts
measureProcess.resolve {speed: measurements, average: average}
else
@measureSpeed measureProcess
measureProcess.done (speedResults)->
done?(speedResults)
@measureSpeed measureProcess
return measureProcess
measureSpeed: (deferr)->
testImg = new Image()
startTime = new Date()
testImg.onload = ()=>
delta = new Date() - startTime
speed = @getSpeed 1048576, delta
deferr.notify {bs: speed, delta: delta}
testImg.src = './gen.gif?_='+Math.random()
getSpeed: (size, time)->
time = time/1000
speed = size/time
return speed
@nim579
Copy link
Author

nim579 commented Jan 27, 2014

Не совсем понял о чем ты. Можешь просто внести правки?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment