2012-03-30 2 views
1

서버 측에서 긴 배열을 얻기 위해 AJAX 쿼리를 사용하고 있습니다. 배열이 정말 큽니다 (백만 개의 요소라고합시다). HTTP 쿼리에도 시간이 걸립니다. 콘솔에서 볼 수 있습니다. 그러나 AJAX 쿼리 콜백 함수에서 오는 출력을 볼 때까지 쿼리가 완료된 후 일부 시간이 경과합니다.JSON 문자열을 자바 스크립트 객체로 파싱하는 시간을 측정하는 방법

나는 그 기능 안에서 약간의 시간을 측정하려하지만, 시간 차이는 비참하고 전체 과정을 언급하는 것처럼 보이지 않는다. 파이어 버그 프로파일 결과 의 검사는 나에게 접착제를 포기하지 않았다 다음

내 코드 (내가 jQuery를 사용)입니다 .. (내가 AJAX의 쿼리 기능 이외의 시간 브래킷을 넣으면 왜 어쨌든 분명하다 제로를 얻을 수) :

$.getJSON(
    'some-url', 
    '', 
    function(data) { 
     var start = (new Date).getTime(); 
     console.log(data.length); 
     var end = (new Date).getTime(); 
     console.log((end - start) /1000); // for 1M array gives something like 0.03 s 
    } 
); 

그래서 나는 그 엔진을 다루는 것과 관련된 브라우저의 엔진에서 일어나는 모든 과정을 포착하고 싶습니다. 어떻게하면됩니까?

+1

백만 개의 항목 배열을 전달하지 마십시오. 그게 나쁜 생각이야. – zzzzBov

+0

아마도 $ .getJSON 전에 시작 시간을 이동하고 onComplete() 이벤트에 종료 시간을 남겨 두겠습니까? 또한 var 변수를 전역 변수로 시작하십시오. – Panagiotis

+1

'.getJSON'을 사용하면 jQuery 코드 내부에서 JSON 구문 분석 작업을 수행 할 수 없으므로 시간을 측정 할 수 없습니다. – Pointy

답변

2

사용 ajax하지 getJSON : 나는 당신의 대답을 이해한다면

$.ajax({ 
    url: 'some-url', 
    dataType: 'text', 
    success: function(jsonText) {   
     console.log(jsonText.length); 
     var start = (new Date).getTime(); 

     var data = $.parseJSON(jsonText); 

     var end = (new Date).getTime(); 
     console.log((end - start) /1000); // for 1M array gives something like 0.03 s 
    } 
}); 
+0

님, 안녕하세요. 내가 혼자서 그것을 어떻게 추측하지 않았는지. – 1234ru

1

올바르게, 당신은 응답을 처리하는 데 걸리는 시간을 측정합니다. $ .getJSON에 전달 된 콜백이 JSON이 응답 된 후에 호출됩니다. 아마도 $ .ajax라는 다른 방법을 사용해야 할 것입니다. 다음 코드는 (안된) 작동합니다 :

function initiateGetRequest(url, callback) 
    var req; 
    req = new XMLHttpRequest(); 
    req.open("GET", url, true); 
    req.onreadystatechange = function() { 
     if (req.readyState === 4) { 
      callback(req.responseText, req.status); 
     } 
    }; 
    req.send(null); 
} 

function processMyJSONResponse(responseText, statusCode) { 
    var startTime;   
    var myResponseObject; 
    if (statusCode === 200) { 
     startTime = Date.now(); 
     // Processing logic here 
     myResponseObject = JSON.parse(responseText); 

     console.log((Date.now() - startTime)/1000); 
    } else { 
     console.log("Something went wrong, statusCode: " + statusCode); 
    } 
} 

// somewhere else 
initiateGetRequest("myUrl", processMyJSONResponse); 
+0

네, 그 코드가 작동합니다. \t jQuery.ajax와 같은 시간을 보여줍니다. \t \t 글쎄, 1M 항목으로 JSON 배열을 처리하는 것이 그리 어렵지는 않았다. 약 0.23 초 (6 MB, 숫자지만 여전히 그렇다). \t 필요한 대부분의 시간은 실제 데이터 (serveral 메가 바이트)를 파싱하지 않도록하는 것입니다. – 1234ru

0

대답은 간단하다 : create a jsPerf test case. 비동기 또는 "지연된"테스트를 실행할 수 있습니다.

또는 Benchmark.js을 사용하고 테스트 사례를 수동으로 설정할 수 있습니다.

과 같이 두 개의 new Date 타임 스탬프를 단순히 비교하지 마십시오.

+0

저것 좀 봐. 잠시 동안 전체 시간이 길어서 처음에는 단순한 날짜로 살 수 있다고 말해야합니다. – 1234ru