0

다음은 더 많은 질문이 있습니다. "자바 엔진이 알려진 엔진 (알려진 엔진 기준)에서 이러한 고려 사항에 어떤 영향이 미칩니 까?"알 수없는 Javascript 엔진에 대한 코드를 고려할 때 실행 속도와 메모리 보존에 가장 큰 영향을 미치는 요소는 무엇입니까?

Node.js를 같은 것을 만드는 사람 Strongloop 같은 사람들은, 또한 util.inherits 대신하는 내부 함수와 같은 코드를 쓰기 때문에 나는 "커뮤니티"를 요청해야 느끼는 이유는 : 그들은 속성 정의를 작성 TheConstructorFunction.prototype.constructor = TheConstructorFunction을 이는 자체 4 개 개의 속성이 설정되어있다 : 이것은 나에게 비효율적 인 것 같지만

ctor.prototype = Object.create(superCtor.prototype, { 
    constructor: { 
     value: ctor, 
     enumerable: false, 
     writable: true, 
     configurable: true 
    } 
}); 

후, 나는 단지 같은 코드의 저자 반대로 삼년 더 나은 자바 스크립트를 쓰기 위해 노력했습니다. 이것이 왜 또는 효율적이지 않은지에 대한 설명이 있습니까?

하나의 대답은 util.inherits는 하위 클래스 작업이 거의 없으므로 비효율적이지 않습니다. 그러나 일부 라이브러리가 결과 관찰을 테스트하기 위해 빌드와 빌드 사이에 발생하는 수백, 수천 개의 하위 클래스 작업을 처리한다고 가정 할 때 Node.js가 내부적으로 util.inherits를 사용하는 경우 이는 소비자의 개발 시간에 영향을 미칩니다. 나는이 수준에서 효율성이 중요하다고 생각하고 util.inherits가 내부적으로 사용되지 않기를 바란다. 나는 util.inherits의 목적을 이해하지 못한다. 왜 그걸 가지고 있죠? 나는 그것이 비효율적 인 합성을 촉진한다고 생각합니다. require('util').inherits(C1,C2);은 거의 동의어이며 C1.prototype=Object.create(C2.prototype); C1.prototype.constructor=C1;보다 느릴 수 있습니다. 더 큰 라이브러리가 Node.js의 효율성에 의존 할 것이기 때문에이 전문가들이 그 기능을 내부적으로 사용한다면 걱정이된다. .constructor을 열거하지 않는 것에 관해서는 ... "열거 가능성"문제는 드물고 소비자에게 맡겨야한다고 생각하지만, 내부 작업이 util.inherits에 의존하는 경우 이것이 실제로 남아 있지 않습니다. 소비자에게.

+0

당신이'ctor.prototype'에 준 예제는 그것을 비교 한'prototype.constructor'와 다릅니다. 오렌지 사과입니다. – TylerY86

+0

"* 일부 라이브러리는 결과 관찰을 테스트하기 위해 빌드간에 발생하는 수백 및 수천 개의 하위 클래스 작업을 처리합니다."- 오 진짜? 왜 그렇게 생각하니? 아니,이 규모조차도별로 중요하지 않습니다. 디스크에서 소스 파일을 읽는 것. "거의 동의어이며 느린 것 같습니다."- 실제로는 아닙니다. 그 점이 궁금하신 분은 직접 벤치마킹하십시오. 아니요, 표준 라이브러리 함수는 비효율을 촉진하지 않으며, 단순화 *를 촉진하여 개발자가 마이크로 최적화보다 훨씬 많은 시간을 절약 할 수 있습니다. – Bergi

+0

@Bergi, 당신 말이 맞을지 모르지만 나는 당신의 도전을 받아들입니다. 가까운 미래에 어느 시점에서 벤치마킹 할 것입니다.왜냐하면, 당신이 옳다면, 나는 단지 그것에 대해 생각하는 데 더 많은 시간을 낭비하고 있습니다. 그러나 당신이 틀린 경우에, 당신 및 bloggers/educators/전문가의 전체 회전은 상당히 심각한 개념을 퍼지고있다. PHP windparm 관리 SaaS를 작성했으며 요청 유형에 따라 거의 20-50 가지 클래스를 사용합니다. Node.js에서 시스템을 구현할 것을 고려하고 있지만 기본 시스템은 Wordpress와 비슷한 엔진으로 계획하고 있습니다. .. 한 가지 예가 있습니다. – flcoder

답변

0

JavaScript 엔진 작성자가 가장 잘 대답합니다.

성능 조정이라는 프로세스입니다.

Here's Google's guide. Here's Mozilla's guide.

Node.js를 javascript로 빠르게 실행하는 것이 Strongloop 비즈니스의 핵심입니다. 그들은 자바 스크립트 최적화 seriously 걸립니다.

this과 같은 몇 가지 문제가 있습니다. 사용 약속, 비동기 작업, 콜백 등

벤치 마크 합리적인 현실적인 테스트 케이스와 코드를 - 대부분 그러나

는 이벤트 루프를 차단하지 않습니다. 적용 범위를 확인하십시오.

성능 튜닝에 대한 검색의 주요 원인을 알게되면 더 깊은 분석을 시작해야합니다. 코드를 프로파일 링해야합니다.

Thorsten Lorenz는 노화가 있지만 여전히 유용한 내부자 V8 정보가 많이 포함 된 GitHub repository과 관련이 있습니다.

blog articles, like this guy을 게시하는 개발자가 많이 있습니다. 그들이 말하는 내용을 알고 있는지 확인해야합니다. 그는 그렇지 않습니다.

Promises를 잘 구현 한 Bluebird는 올바른 최적화의 절정입니다.그들이 말한 것들에 대해서는 an articlea guide이 있는데, 이는 단순히 최적화를 죽이는 일반적인 것들입니다.

업데이트

당신이 util.s 구현의 준 예는 상속 체인은 아마 별도의 질문을해야한다. 그들이 원숭이 패치를하고 있는지 확실하지 않습니다. 다른 클래스와 프로토 타입을 봐야 할 것입니다.

상속을 구현하는 알려진 방법의 변형, 특히 Object.create의 장단점과 변형에 대해서는 this MDN article을 참조하십시오.

내장 프로토 타입 (일명 "원숭이 패치")은 새로운 자바 스크립트 엔진의 기능을 백 포트입니다을 확장하기위한 유일한 이유; 예를 들어 Array.forEach 등이 있습니다.

Here's 이러한 종류의 작업이 수행 된 이유에 대한 몇 가지 이유가 있습니다. I answered a question 너무 오래 전에 모든 자식에게 확장 메서드를 추가하기 위해 상속 체인의 맨 위에 클래스를 삽입하는 것에 대해. 좋은 생각이 아닙니다.

util.js 구현에서 Object.create의 구현이 inherits 인 경우 원래 최적화를 시도했을 수 있습니다. early revisions에 따르면 프로토 타입을 암시 적으로 변경할 수 없으므로 이론적으로 메서드 확인 성능이 향상되었습니다. Pedantically 말하자면, 그것은 정확하지 않았고, JavaScript의 프로토 타입 상속 기능을 둘러싼 본질적으로 해킹이었습니다. 새 버전에서는 이것을 Object.setPrototypeOf으로 바꿉니다.

편집 : 당신이 이것을 down-voted했다면, 나는 왜 그런지 엿볼 것이다.

+0

이것은 내가 찾는 대답의 좋은 예입니다. – flcoder

+0

더 중요한 일반 세부 사항을 발견하면이를 기반으로합니다. 성능 튜닝은 정말 깊이있게 진행될 수 있습니다. [이 질문을 확인하십시오] (http://stackoverflow.com/questions/39576177/locate-corresponding-js-source-of-code-which-is-not-optimized-by-v8/39762720#39762720). – TylerY86

+0

제 질문을 편집하고'prototype.constructor'를'TheConstructorFunction.prototype.constructor'로 범위를 지정했습니다 ... 이것은'ctor.prototype' 생성자 속성 정의와 같습니다. 나는 그것을 열거 할 수 없게 만들기 위해 이것을한다. 그러나 나는 이유를 알지 못한다. 만약 내가 Collection 형 클래스를 만들고 있다면, 아마도 ... 그러면 나는 미리 가서 어떤 속성들을 열거 할 수 없게 만들 것이다. 그러나 다른 유형의 클래스에 대해서는 생성자 속성을 "숨기는"추가 문제가 있을지 잘 모르겠습니다. 나는 이런 종류의 부풀어 오르는 것을 보았는데, 심지어 전문가들도 그들이하는 일을 알고 있는지 궁금하게 생각합니다. – flcoder

1

번호 효율이 여기에 문제가되지 않는 나에게 비효율적 인 것 같다. 하위 클래 싱은 드문 작업이며 코드가 단순 할당보다 느릴지라도 (대부분 차이가 크지는 않음) 성능에 영향을 미치지 않습니다.

어디서나 사용되는 utils.inherit과 같은 라이브러리 기능의 경우 특히 중요합니다. 정확도는입니다. 그렇다면 왜 속성 속성을 사용합니까? .constructor을 열거 할 수 없게 만들려면 기본적으로 생성되어 일반적으로 예상되는 개체 인 .prototype의 경우 표준 인 것처럼.

여기서 속도와 메모리를 고려하지 않아도된다고 가정 할 때 예상대로 최적화가 수행되지 않습니다.

+0

결론을 설명 할 충분한 여지가 없기 때문에 나의 대답이 업데이트되었습니다. 그러나 당신이 말하는 것을 생각해보십시오. "속도 나 메모리는 utils.inherits와 같은 라이브러리 기능에 대해 고려해야 할 필요가 없습니다."가장 중요한 것은 "정확성"입니다. 나는 정확성이 중요하다고 확신한다. 글쎄, 그것은 더 좋을 것이다. 왜냐하면 그렇지 않다면 깨져 버리기 때문이다.그러나 이것이 나의 문제입니다. 차선의 코드를 허용하기위한 (너무 많은) 정당화가 많이 있습니다. – flcoder

+0

@flcoder 정확한 코드는 최적의 코드입니다 :-) 내 주장은 구체적으로'util.inherits'에 관한 것이고 실제로 성능에 중요한 다른 함수들 (예를 들어 Node의'Stream' 구현) *은 마지막 세부 사항에 최적화되어 있습니다. 그러나 희생시키지 않습니다. 그렇다면 정확성. – Bergi

+0

나는 네가하는 말을 듣는다. 왜냐하면 나는 그 곳곳에서 그 말을 듣고 있었기 때문에 나는 그것을 교수가 가르치는 것이라고 생각하고있다. 코드의 특정 부분이 최적화와 관련 될 필요가 없다는 느낌을받을 때 부 풀리는 것이 좋습니다. 첫째로, util.inherits는 완전히 쓸모가 없다고 생각합니다. 둘째, 나는 여러분의 말에 "어디에서나 사용되는"것이고, 그것이 내가 당혹 스럽다는 것을 알게합니다. 이것이 바로 "찬성"이되는 방식입니다. P : 그래서 제가 전체 커뮤니티에 제 질문을했습니다. 다른 사람들이 신뢰할 수있는 자바 스크립트 최적화 조언을 고려하고 있는지 확인하고 싶습니다. – flcoder

관련 문제