JavaScript-함수를 변수에 선언하는 것이 현명한 생각입니까?

빌랄 075_

제목이 언급했듯이. 성능에 관심이 있다면 변수에 함수를 선언하는 것이 현명한 생각 입니까? 예를 들어이 시나리오에서는 x 번 반복해서 호출되는 함수를 만들고 있습니다 . 이 함수는 쌍 변수를 포함하며 인수를 허용하지 않습니다. 이 변수 중 하나에는 익명 함수가 포함되어 있으며이 변수 / 함수는 부모가 호출 될 때마다 호출됩니다.

따라서 기본적으로 구조는 다음과 같습니다.

   function myFunction() {
  var foundElements = document.querySelectorAll("*"),
    updateElements = function() {
      console.log("Hello world, i've been called to work as a slave!");
    };

  if (foundElements.length > 0) {
    updateElements();
  }
}

이 함수를 명명 된 / 분리 된 함수로 선언하는 것이 더 낫습니까? 아니면 이것이 갈 길입니까? (이 방법으로 인해 부모가 호출 될 때마다 시스템이 함수를 다시 생성한다고 생각하기 때문에 내가 틀렸다면 수정하십시오)

미리 감사드립니다.

일 마리 카로 넨

예, 새 함수 인스턴스를 만들면 측정 가능한 오버 헤드가 있습니다. 이 오버 헤드가 실제 코드에서 차이를 만드는지 여부는 전적으로 또 다른 문제입니다.

예를 들어, 다소 비효율적 인 다양한 방식으로 부울 플래그를 전환하는 다음과 같은 간단한 벤치 마크를 고려해보십시오.

var suite = new Benchmark.Suite;
var flag = true;

suite.add('baseline', function() {
  flag = !flag;
});

suite.add('local helper function', function() {
  var f = function(x) { return !x };
  flag = f(flag);
});

var g = function(x) { return !x };
suite.add('external helper function', function() {
  flag = g(flag);
});

console.log('Running benchmark on ' + Benchmark.platform.description );
suite.on('cycle', function(event) { console.log(' - ' + event.target) });
suite.on('complete', function() { console.log('Fastest is ' + this.filter('fastest').map('name')) });
suite.run({ 'async': true });
<script src="https://cdn.jsdelivr.net/g/[email protected],[email protected],[email protected]"></script>

Chrome 52에서이 벤치 마크를 실행하면 다음과 같은 결과가 나타납니다.

Running benchmark on Chrome 52.0.2743.116 32-bit on Windows Server 2008 R2 / 7 64-bit
 - baseline x 75,600,376 ops/sec ±0.90% (62 runs sampled)
 - local helper function x 5,912,099 ops/sec ±0.36% (63 runs sampled)
 - external helper function x 74,912,931 ops/sec ±1.05% (62 runs sampled)
Fastest is baseline,external helper function

놀랍게도 기준 코드와 변수를 토글하기 위해 외부 함수를 호출하는 버전은 거의 똑같이 빠릅니다. 그 차이는 통계적으로 유의하지 않으며 (즉, 랜덤 노이즈와 효과적으로 구분할 수 없음) 벤치 마크 라이브러리 는 둘 다 1 위를 차지한 것으로보고합니다. Chrome의 JS 엔진이 외부 도우미 기능을 인라인하여 두 버전을 효과적으로 동일하게 만들 수있는 것 같습니다. 그러나 모든 반복에서 새 도우미 함수 인스턴스를 만들고 호출하는 버전은 함수를 만들고 호출하는 오버 헤드를 반영하여 거의 13 배의 시간이 걸립니다.

즉, 13 배 오버 헤드는 참 / 거짓 플래그를 토글하는 사소한 작업과 비교됩니다. 약간 더 현실적인 사용 사례를 시뮬레이션하기 위해 벤치 마크 코드에 간단한 DOM 쿼리를 추가하면 어떤 일이 발생하는지 살펴 보겠습니다.

var suite = new Benchmark.Suite;
var flag = true;

suite.add('baseline', function() {
  var foundElements = document.querySelectorAll("*");
  flag = !foundElements;
});

suite.add('local helper function', function() {
  var f = function(x) { return !x };
  var foundElements = document.querySelectorAll("*");
  flag = f(foundElements);
});

var g = function(x) { return !x };
suite.add('external helper function', function() {
  var foundElements = document.querySelectorAll("*");
  flag = g(foundElements);
});

console.log('Running benchmark on ' + Benchmark.platform.description );
suite.on('cycle', function(event) { console.log(' - ' + event.target) });
suite.on('complete', function() { console.log('Fastest is ' + this.filter('fastest').map('name')) });
suite.run({ 'async': true });
<script src="https://cdn.jsdelivr.net/g/[email protected],[email protected],[email protected]"></script>

이번에는 결과가 다음과 같습니다.

Running benchmark on Chrome 52.0.2743.116 32-bit on Windows Server 2008 R2 / 7 64-bit
 - baseline x 898,041 ops/sec ±25.49% (39 runs sampled)
 - local helper function x 605,107 ops/sec ±30.57% (47 runs sampled)
 - external helper function x 720,695 ops/sec ±34.60% (38 runs sampled)
Fastest is baseline,external helper function

예, 순위는 여전히 동일하지만 (타이밍에 대한 차이는 훨씬 높지만) 이제 내부 도우미 기능이있는 버전은 외부 도우미 기능을 사용하는 버전보다 약 20 % 느립니다. (아직도 예상했던 것보다 많은데, querySelectorAll()적어도이 스 니펫과 같은 정말 간단한 문서에서는 꽤 빠릅니다.) 그리고 실제로 DOM 요소로 작업을 수행 하기 위해 코드를 더 추가 하면 상대적 차이가 훨씬 더 작아집니다. 아직도.

예, 헬퍼 함수를 ​​호출하는 다른 함수 내부 또는 외부에서 정의 할 수 있고 (그리고 자체적으로 반복적으로 호출 됨) 다른 옵션보다 하나의 옵션을 선호 할 다른 이유없는 경우 다음을 유지하는 것이 좀 더 효율적입니다. 함수 객체의 반복 생성을 방지하고 JS 엔진의 인라인을 더 쉽게 만들기 위해 외부에 정의합니다. 그러나 실제로는,하지 않는 한이 중첩 된 함수임을 알 정확하게 코드의 성능이 중요한 부분, 당신은 아마 그것에 대해하지 걱정해야한다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

익명의 JavaScript 함수를 함수 매개 변수로 선언하는 이유는 무엇입니까?

분류에서Dev

"is"를 사용하여 변수에 포함 된 함수를 확인하는 것이 좋은 생각입니까?

분류에서Dev

여러 개의 등호로 한 번에 두 개의 변수를 선언하는 것이 비단뱀입니까?

분류에서Dev

함수 객체보다 람다를 선호하는 것이 현명합니까?

분류에서Dev

익명 함수를 변수로 저장하고 고차 함수에 전달하는 것이 유용한 이유는 무엇입니까?

분류에서Dev

반복되는 경우 메서드에서 변수를 꺼내 한 번 선언하는 것이 좋은 방법입니까? (C 언어)

분류에서Dev

안드로이드에서 정적 뷰를 선언하는 것이 좋은 생각입니까?

분류에서Dev

이 JavaScript 함수는 가변 참조 인수를 취하는 순수한 함수입니까?

분류에서Dev

Perl에서 함수를 변수로 선언하는 방법이 있습니까?

분류에서Dev

함수 핸들을 사용하여 함수를 생성하는 것과 syms를 선언하는 것의 차이점은 무엇입니까?

분류에서Dev

선언에서 매개 변수 이름을 생략하는 것이 좋은 방법입니까?

분류에서Dev

클래스에서 CSS 변수를 선언하는 것이 유효합니까?

분류에서Dev

동일한 명령문에서 종속 자바 스크립트 변수를 선언하는 것이 안전합니까?

분류에서Dev

Javascript에서 "기능적 스타일"if-as-expression을 수행하는 것이 좋은 생각입니까?

분류에서Dev

확장 인터페이스에서 멤버를 선언하는 것과 구현에서 선언하는 것의 차이점은 무엇입니까?

분류에서Dev

연결 된 #defines를 사용하여 일반 언어 정수 인덱스를 선언하는 것이 좋은 생각입니까?

분류에서Dev

함수 변수 선언이 필요합니까 (Javascript에서)?

분류에서Dev

함수에 대한 일반 포인터를 선언하는 동안 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

변수 선언 사이에 변수를 초기화하는 것이 금지되어 있습니까?

분류에서Dev

Javascript : parseInt () 함수를 사용한 후에도 NaN이 발생하는 이유는 무엇입니까?

분류에서Dev

배열이 아닌 변수의 주소를`Type ptr [static 1]`로 선언 된 함수 매개 변수에 전달하는 것이 타당합니까?

분류에서Dev

Haskell에서 동일한 변수를 포함하는 두 데이터 유형을 선언하는 방법은 무엇입니까?

분류에서Dev

사용하지 않는 함수를 선언하지만 정의하지 않는 것이 합법적입니까?

분류에서Dev

익명 함수를 변수에 할당하는 이유는 무엇입니까?

분류에서Dev

초기화되지 않은 변수를 srand에 전달하는 것이 좋은 생각입니까?

분류에서Dev

빌드 메소드에서 변수를 선언하는 것이 나쁜 습관입니까?

분류에서Dev

Python 클래스 내에서 변수를 선언하는 것이 더 좋은 곳은 어디입니까?

분류에서Dev

함수에서 기본 매개 변수를 선언 할 때 선호하는 스타일이 있습니까?

분류에서Dev

'scratchpad'변수를 수정 한 const 함수가있는 것이 맞습니까?

Related 관련 기사

  1. 1

    익명의 JavaScript 함수를 함수 매개 변수로 선언하는 이유는 무엇입니까?

  2. 2

    "is"를 사용하여 변수에 포함 된 함수를 확인하는 것이 좋은 생각입니까?

  3. 3

    여러 개의 등호로 한 번에 두 개의 변수를 선언하는 것이 비단뱀입니까?

  4. 4

    함수 객체보다 람다를 선호하는 것이 현명합니까?

  5. 5

    익명 함수를 변수로 저장하고 고차 함수에 전달하는 것이 유용한 이유는 무엇입니까?

  6. 6

    반복되는 경우 메서드에서 변수를 꺼내 한 번 선언하는 것이 좋은 방법입니까? (C 언어)

  7. 7

    안드로이드에서 정적 뷰를 선언하는 것이 좋은 생각입니까?

  8. 8

    이 JavaScript 함수는 가변 참조 인수를 취하는 순수한 함수입니까?

  9. 9

    Perl에서 함수를 변수로 선언하는 방법이 있습니까?

  10. 10

    함수 핸들을 사용하여 함수를 생성하는 것과 syms를 선언하는 것의 차이점은 무엇입니까?

  11. 11

    선언에서 매개 변수 이름을 생략하는 것이 좋은 방법입니까?

  12. 12

    클래스에서 CSS 변수를 선언하는 것이 유효합니까?

  13. 13

    동일한 명령문에서 종속 자바 스크립트 변수를 선언하는 것이 안전합니까?

  14. 14

    Javascript에서 "기능적 스타일"if-as-expression을 수행하는 것이 좋은 생각입니까?

  15. 15

    확장 인터페이스에서 멤버를 선언하는 것과 구현에서 선언하는 것의 차이점은 무엇입니까?

  16. 16

    연결 된 #defines를 사용하여 일반 언어 정수 인덱스를 선언하는 것이 좋은 생각입니까?

  17. 17

    함수 변수 선언이 필요합니까 (Javascript에서)?

  18. 18

    함수에 대한 일반 포인터를 선언하는 동안 오류가 발생하는 이유는 무엇입니까?

  19. 19

    변수 선언 사이에 변수를 초기화하는 것이 금지되어 있습니까?

  20. 20

    Javascript : parseInt () 함수를 사용한 후에도 NaN이 발생하는 이유는 무엇입니까?

  21. 21

    배열이 아닌 변수의 주소를`Type ptr [static 1]`로 선언 된 함수 매개 변수에 전달하는 것이 타당합니까?

  22. 22

    Haskell에서 동일한 변수를 포함하는 두 데이터 유형을 선언하는 방법은 무엇입니까?

  23. 23

    사용하지 않는 함수를 선언하지만 정의하지 않는 것이 합법적입니까?

  24. 24

    익명 함수를 변수에 할당하는 이유는 무엇입니까?

  25. 25

    초기화되지 않은 변수를 srand에 전달하는 것이 좋은 생각입니까?

  26. 26

    빌드 메소드에서 변수를 선언하는 것이 나쁜 습관입니까?

  27. 27

    Python 클래스 내에서 변수를 선언하는 것이 더 좋은 곳은 어디입니까?

  28. 28

    함수에서 기본 매개 변수를 선언 할 때 선호하는 스타일이 있습니까?

  29. 29

    'scratchpad'변수를 수정 한 const 함수가있는 것이 맞습니까?

뜨겁다태그

보관