2013-07-16 2 views
-88

조건 연산자 === 및 할당 연산자 = 사이의 성능 차이가 있습니까? 나는 어떤 몽구스에 후크 미들웨어를 미리 저장 쓰고 난 사이의 속도 차이의 상당 부분이 있다면 궁금 : 자바 스크립트 성능, 할당 연산자 대 조건문

UserSchema.pre('save', function (next) { 
    if (!this.isModified()) { 
     return next(); 
    } 
    if (this.crm.update === true) { 
     this.crm.isUpToDate = false; 
    } 
    next(); 
}); 

편집

UserSchema.pre('save', function (next) { 
    if (!this.isModified()) { 
     return next(); 
    } 
    this.crm.isUpToDate = false; 
    next(); 
}); 

다음 건설에 대한

감사합니다 코멘트.

기본적으로 성능에 많은 차이가있는 것처럼 보이지 않습니다 (위에서 언급 한 것처럼 무시할 수 있음). 속도가 http://jsperf.com/ 인 멋진 도구를 사용해 주셔서 감사합니다. 전에 들어 본 적이 없었습니다.

코드에 대해 궁금한 분들은 먼저 원래 게시물에서 뻔뻔한 오류를 만들었습니다. 그런 다음 모든 사람들이 나에게 지적하려고했을 때 울었습니다. 이것이 모두가 싫어하는 이유 일 것입니다. 여기

내가 뭐하는 거지입니다 :

내가 미리 저장 몽구스 (A 몽고 데이터베이스에 대한) 미들웨어 훅 훅이 문서가 저장 될 때마다 실행됩니다있다. 저장 시점에서 문서가 업데이트되었는지 확인합니다. 그럴 경우 crmIsUpToDate을 false로 설정합니다. crmIsUpToDate은 cron 작업이 실행될 때 true로 설정됩니다. 이 후크는 cron 작업이 문서에 도착하기 전에 여러 번 실행될 수 있습니다.

비교 ===을 수행하고 =을 수행하는 것의 차이점이 있기 때문에 질문에 필요하다고 생각하지 않았습니다. 나는 주된 질문에 정말로 영향을 미치기 때문에 코드를 작성해서는 안된다.

+12

1) 성능 향상은 무시할 수 있습니다. 2) http://jsperf.com –

+14

두 가지 예는 아는 것과 똑같은 일을하지 않습니까? – adeneo

+3

그게 관련이 있습니까? 이들은 동일한 기능을 수행하지 않으므로 서로에 대해 안정적으로 벤치 마크 될 수 없습니다. – War10ck

답변

37

JavaScript가 아닌 참조하지 않는 언어가 있고 큰 개체의 할당 ('=', 복사 작업이 발생 함)을 수행하면 "느리게"될 수 있습니다. 따라서 복사 작업이 정말로 필요한지 확인하면 상당한 시간을 절약 할 수 있습니다.

는하지만 자바 스크립트는 기본 refcount로 언어이다 :

object1 = {a: 1, b: 2}; 
object2 = object1;   // refcounting copy? 
object1.a = 3;    // test by modifying the first object 
console.log(object2.a); // will return 3 => refcounting 

=> 그래서 모든 할당 작업 ('=') 아주 저렴합니다.

그리고 훨씬 더 빠르게, 또는 적어도 개체만큼 빠른 네이티브 데이터 형식 (bool, 숫자는 동일합니다)으로 작업하고 있습니다.
참고 : 문자열은 JavaScript에서 참조하지 않으며,이 경우 예외입니다.

이제 우리는 과제가 저렴하다는 것을 알게되었습니다. 그러나 신분 확인은 무엇입니까 ('===')?

코드에서 this ->crm ->update의 오브젝트를 순환해야합니다. 추가 시간이 필요합니다. 그런 다음 유형 (bool)의 동일성을 검사 한 다음 내용 (false)이 동일한 지 확인해야합니다.
긴 파이프 라인을 가진 최신 CPU가 분기를 잘못 예측하여 전체 파이프 라인을 다시로드하는 프로그램 흐름에 조건이 추가됩니다. 이것은 또한 꽤 많은 CPU 사이클을 낭비합니다 (현대 CPU가 지금은 꽤 좋음).

=>이 비교 ('===')는 상당히 비쌉니다.

결론 # 1 :
은 쉽게 피할 수있는 고가의 시험에 의해 싼 코드를 보호 할 것이다.
코드가 비싸면 테스트가 끝날 때까지 시간을 절약 할 수 있습니다. 이로 인해 :

결론 # 2 :
조숙 한 최적화는 악합니다! 코드를 읽기 어렵게 만들고, 새로운 버그를 도입하고, 코드를 더 커지고 (캐시 효율성에 좋지 않음) ...
=> 성능 문제가있는 곳에서 코드 부분 만 최적화하십시오. 그런 다음 프로파일 링 정보만을 기반으로합니다. 인간은 여기에있는 효과를 짐작할 때 상당히 나쁩니다 ...