2013-02-13 2 views
6

Я хотел бы реализовать скрипт, который будет измерять время отклика моего сервера (= удаленный URL) от клиента, используя обычный браузер без каких-либо дополнительных плагинов (Java и т. Д.).Измерение времени отклика сервера (на стороне клиента)

Я только смотрел на скорости (время отклика) сети, не скорость загрузки страницы.

Что вы посоветуете мне измерить? Он должен работать на tcp/ip, а не на ICMP (ping).

Как бы вы могли реализовать реализацию на стороне клиента? Я бы предпочел использовать JavaScript (JQuery).


Update: Как мне нужна перекрестная проверка домена, Аякс вызовы, кажется, не быть одним из вариантов

Кроме того, метод Ajax, кажется, не точен на всех. Результаты, по-видимому, имеют накладные расходы около 50 мс (это почти постоянное значение, независимо от того, что такое домен - я думаю, это промежуток времени между ними) на испытательной машине по сравнению с информацией от FireBug

+0

Вы имеете в виду [как это] (http://stackoverflow.com/questions/3498503/find-out-how-long-an-ajax-request-took-to-complete?lq=1)? – Carsten

+0

Да, но насколько я знаю, jQuery.get возвращает весь ответ, включая html-код. В этом случае скорость сайта будет влиять на время отклика. Я скорее ищу что-то вроде ping. EDIT: кроме того, JQuery может (я не знаком с ним) вызывать другой код перед вызовом обратного вызова, который повлияет на метод измерения – Kraken

+0

Чтение об этой проблеме, похоже, что перекрестные вызовы домена из javascript/jquery потеряны причина.JSONP и прокси-серверы, похоже, являются ответом, и, делая это, ваше время ответа больше не имеет значения. –

ответ

1

Создайте ресурс, который всегда возвращает пустой ответ 200 OK по URL-адресу, например mysite.net/speedtest. Потом что-то вроде:

var startTime = (new Date()).getTime(), 
    endTime; 

$.ajax({ 
    type:'GET', 
    url: 'http://mysite.net/speedtest', 
    async: false, 
    success : function() { 
     endTime = (new Date()).getTime(); 
    } 
}); 

alert('Took ' + (endTime - startTime) + 'ms'); 

Это даст вам время, которое требуется, чтобы послать запрос на сервер, а также время, которое требуется сервер для загрузки минимального набора ресурсов, которые она требует, чтобы ответить на запрос.

Новое: Ваш вопрос сейчас несовместим с дополнительной информацией, которую вы добавили. Вы хотите, чтобы клиентский пинг с URL-адресом, который вы не контролируете, - это совсем другое дело, чем то, что вы изначально запрашивали, и время ответа от вашего сервера. Если вы пытаетесь получить ping клиента на свой сервер, вызов ajax будет делать трюк. Если вы пытаетесь получить свой пинг на каком-то другом сервере, я немного смущен относительно вашей цели.

+0

Это будет предупреждать о завершении запроса ajax. –

+0

@RobertFricke Ой, ты прав. Я исправил это, спасибо за примечание. – AmericanUmlaut

+0

прохладные бобы. Однако по внешнему виду «endTime» устанавливается правильно, но «alert» все еще выполняется до «успешного» обратного вызова, поскольку он будет выполняться непосредственно после ajax-вызова (до того, как будет выполнен обратный вызов). –

7

Вам просто нужно ко времени запрос:

var sendDate = (new Date()).getTime(); 

$.ajax({ 
    //type: "GET", //with response body 
    type: "HEAD", //only headers 
    url: "/someurl.htm", 
    success: function(){ 

     var receiveDate = (new Date()).getTime(); 

     var responseTimeMs = receiveDate - sendDate; 

    } 
}); 
+0

responseTimeMs не отображается за пределами вашего функция успеха. – AmericanUmlaut

+0

Да, но насколько я знаю, это возвращает весь ответ, включая html-код. В этом случае скорость сайта будет влиять на время отклика. Я прав? – Kraken

+1

Если вы не хотите, чтобы сервер возвращал тело ответа, используйте 'type:" HEAD "', и возвращаются только заголовки. –

0
var startTime = (new Date()).getTime(), 
    endTime; 
$.ajax({ 
type: "GET", 
url: "test.html", 
dataType: "html", 
success:function(data){ 
endTime = (new Date()).getTime(); 
} 
}); 

Теперь возьмите разницу.

0

Вы можете сделать это очень легко.

var t = Date.now(); 
var t2; 
$.ajax({ 
    url:'page', 
    success:function(){ 
     t2 = Date.now(); 
     console.log(t2-t);//the time needed to do the request 
    } 
}); 

Страница для запроса должна быть пуста, чтобы имитировать дополнительное время загрузки.

+0

Это то, что я не могу сделать пустым. Во всяком случае, я думаю, что если я просто запрошу заголовки с помощью решения @RobertFricke, я могу обойти эту проблему. – Kraken

+1

@kraken да, вы можете просто получить заголовок, и проблема решена. – Licson

Смежные вопросы