2011-03-23 6 views
0

약 5 년 전이 프로젝트에서 AJAX 라이브러리를 사용하여 막혔습니다. JSON에서 날짜를 파싱 할 때 몇 가지 문제가있었습니다. 나는 하나의 정규식 사용하기 위해 구문 분석 함수를 다시 작성 감아 :이 정말 잘 작동어떻게이 JSON 날짜 구문 분석 속도를 높일 수 있습니까?

return eval('(' + (enableDateParsing ? text.replace(/"(?:\\)?\/Date\((.*?)\)(?:\\)?\/"/g, "new Date($1)") : text) + ')'); 

을,하지만 난 IE8/크롬/FF에서 네이티브 JSON 구문 분석을 사용하면 내가 속도를 얻을 수 있다고 생각, 그래서 추가 이 비트 :

if (typeof JSON !== 'undefined' && typeof JSON.parse !== 'undefined') {  
     var nativeJsonDateParseRegex = /\/Date\(.*?\)\//g;  
     return JSON.parse(text, function (key, value) { 
      if (AjaxPro.enableDateParsing && typeof value === 'string' && value.match(nativeJsonDateParseRegex)) 
      { 
       value = new Date(parseInt(value.substr(6))); 
      }      
      return value;   
     });   
    } 
else // revert to eval for ie6/ie7 

회귀 알림 콜백은 반환 된 각 JSON 속성마다 한 번씩 실행되므로 매우 빠릅니다. 프로파일 중에는 170484 번 호출되었지만 여전히 매우 빠르게 실행됩니다 (131.237ms). 그것을 더 빨리 만드는 방법에 대한 아이디어 나 심각한 조정없이 할 수있는 최선의 방법입니까?

답변

1

에 코드가 일정 조건을 많이 포함하고, 당신은 네이티브 JSON 지원 여부 번 확인 괜찮 수 있습니다.

제안 : 페이지로드에서 기본 JSPN 지원

  • 확인하고 그에 따라 적절한 기능을 추가 할 수 있습니다.
  • 드롭 정규식에서 전역 플래그 가능하면 모든 날짜가 항상 "/ 날짜 (", 그것에 대한 검색을 시작하는 경우, 그것을
  • 드롭 정규 표현식 필요하지 않은 경우. 그것은 훨씬 더 빨리이다 (참조 benchmark at jsperf.com)
  • 할 일 :에서는 parseInt는 후행 )/을 제거하기 위해 다른 방법으로 대체 할 수 있는지 여부를 확인
  • 을 AjaxPro.enableDateParsing가 일정한 경우,이 경우 AjaxPro.jsonParse에서 제거하고 있으며 네이티브 JSON에 대한 검사와 같은 조건을 만들 수 있습니다.

c RE가없는 ode :

if (typeof JSON !== 'undefined' && typeof JSON.parse !== 'undefined') { 
    AjaxPro.nativeJsonDateParseRegex = /\/Date\(.*?\)\//g; 
    AjaxPro.dateFunc = function(key, value) { 
     if (typeof value === "string" && !value.indexOf("/Date(")) { 
      return new Date(value.substring(6, value.length-2)); 
     } 
     return value; 
    }; 
    AjaxPro.jsonParse = function(text) { 
     if (AjaxPro.enableDateParsing) { 
      return JSON.parse(text, AjaxPro.dateFunc); 
     } 
     return JSON.parse(text); 
    }; 
} else // revert to eval for ie6/ie7 

고도로 최적화되어 있어야합니다. 여러 브라우저에서 직접 테스트를 해보고 싶을 수도 있습니다. 어쩌면 문자열의 속성을 검사하는 것이 그 유형 (의심)을 검사하는 것보다 빠릅니다.

+0

와우 감사합니다. 훌륭합니다. – Shawn

1

하나의 미세 최적화가 아니지만 시도해 볼만한 가치가 있습니다. 하위 문자열에는 밀리 초 타임 스탬프 만 포함되어 있으므로 다른 가비지 문자열은 포함되어 있지 않습니다. parseInt에 대한 호출을 제거 할 수 있습니다. 에 1을 곱한 간단한 수학 연산으로 타이 캐스팅을 시도 할 수 있습니다. 미세 최적화에 너무 민감한 경우 시간을 절약 할 수 있습니다. 예를

value = new Date(1*(value.substr(6))); 

:

a = "a:3333"; 
b = a.substring(2); 
alert(b*2); // alerts 6666 
+0

끝으로)/though : < – Shawn

+1

그러면 다른 접두어가없는 더 나은 하위 문자열을 구문 분석 할 수 있습니다. 접미사 문자열. 간단한 typecasting을 사용하여 :) – DhruvPathak

+0

내가하고 싶지만, 내가 어떻게 내가 문자열의 마지막 2 문자를 제거 할 수 있는지 모르겠다 – Shawn