문제

Class::MethodMaker를 통해 생성된 getter/setter가 호출될 때 발생하는 호출 순서가 정확히 무엇인지 알고 싶습니다.

MethodMaker에서 정의한 getter/setter는 기본 항목(모듈에서 덮어쓰기)보다 비용이 얼마나 더 듭니까?

도움이 되었습니까?

해결책

Class::MethodMaker 성능에 관한 귀하의 질문에 대한 간단한 답변이 없습니다.이전 답변에서 언급했듯이 디버거를 사용하여 내부에서 무슨 일이 일어나고 있는지 확인할 수 있습니다.그러나 나는 Class::MethodMaker가 생성한다는 것을 알고 있습니다. 거대한 설치 시 코드의 양.이는 나에게 세 가지 개별적인 사항을 나타냅니다.

  1. 런타임에 관해서는, 아마 수많은 메소드 생성기 중 더 빠른 측면에 있습니다.그렇지 않으면 설치 시 많은 코드를 생성하는 이유는 무엇입니까?
  2. 디스크에 O(메가바이트)의 코드를 설치합니다!
  3. 간단한 사용 사례를 위해 생성된 코드의 어떤 부분이 로드되는지에 따라 컴파일 시간이 느려질 수 있습니다.

정말로 필요한 것이 무엇인지 생각하려면 몇 분 정도 시간을 투자해야 합니다.간단한 접근자 메서드를 자동 생성하고 싶지만 더 복잡한 것을 직접 작성하려면 Class::Accessor::Fast를 살펴보세요.또는 가장 빠른 접근자 메서드를 원하는 경우 매우 간단한 메서드가 C/XS 코드로 실행되고 가장 빠른 Perl 접근자보다 약 2배 빠른 Class::XSAccessor를 조사하세요.(메모:나는 후자의 모듈을 작성했으므로 이 모듈은 가볍게 받아들이십시오.)

추가 의견:애플리케이션 패키징을 위해 PAR/PAR::Packer 툴킷을 사용할 예정이라면 Class::MethodMaker의 코드 양이 많아 실행 파일 크기가 훨씬 커지고 초기 시작 시간이 느려진다는 점에 유의하세요.또한 C::MethodMaker와 PAR 간에는 알려진 비호환성이 있습니다.그러나 이는 PAR 버그로 간주될 수 있습니다.

다른 팁

이것이 바로 디버깅 도구의 용도입니다 :)

다음을 살펴보세요. 펄 디버그 문서, 특히 프로파일링 섹션.

특히, perl -dDProf filename.pl을 사용하여 스크립트를 실행하면 dprofpp 도구(Perl과 함께 배포됨)가 보고서를 생성할 수 있는 tt.out 파일이 생성됩니다.

다음과 같은 간단한 테스트 스크립트를 사용했습니다.

#!/usr/bin/perl

package Foo;
use strict;
use Class::MethodMaker [ scalar => ['bar'], new => ['new'] ];

package main;
use strict;

my $foo = new Foo;
$foo->bar('baz');
print $foo->bar . "\n";

perl -d:DProf methodmakertest.pl로 실행한 다음 출력에서 ​​dprofpp를 사용하면 다음과 같습니다.

[davidp@supernova:~/tmp]$ dprofpp tmon.out
Class::MethodMaker::scalar::scal0000 has 1 unstacked calls in outer
Class::MethodMaker::Engine::new has 1 unstacked calls in outer
AutoLoader::AUTOLOAD has -2 unstacked calls in outer
Total Elapsed Time =  0.08894 Seconds
  User+System Time =  0.07894 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 25.3   0.020  0.020      4   0.0050 0.0050  Class::MethodMaker::Constants::BEG
                                             IN
 25.3   0.020  0.029     12   0.0017 0.0025  Class::MethodMaker::Engine::BEGIN
 12.6   0.010  0.010      1   0.0100 0.0100  DynaLoader::dl_load_file
 12.6   0.010  0.010      2   0.0050 0.0050  AutoLoader::AUTOLOAD
 12.6   0.010  0.010     14   0.0007 0.0007  Class::MethodMaker::V1Compat::reph
                                             rase_prefix_option
 0.00   0.000  0.000      1   0.0000 0.0000  Class::MethodMaker::scalar::scal00
                                             00
 0.00   0.000  0.000      1   0.0000 0.0000  Class::MethodMaker::Engine::new
 0.00       - -0.000      1        -      -  DynaLoader::dl_undef_symbols
 0.00       - -0.000      1        -      -  Class::MethodMaker::bootstrap
 0.00       - -0.000      1        -      -  warnings::BEGIN
 0.00       - -0.000      1        -      -  warnings::unimport
 0.00       - -0.000      1        -      -  DynaLoader::dl_find_symbol
 0.00       - -0.000      1        -      -  DynaLoader::dl_install_xsub
 0.00       - -0.000      1        -      -  UNIVERSAL::VERSION
 0.00       - -0.000      1        -      -  Foo::new

가장 비용이 많이 드는 호출 두 가지는 Class::MethodMaker::Constants::BEGIN 및 Class::MethodMaker::Engine::BEGIN 블록입니다. 이 블록은 확실히 컴파일 타임에만 호출되므로 스크립트 컴파일 속도가 약간 느려질 수 있습니다. 그러나 후속 객체 생성/접근자 사용은 영향을 받지 않습니다.

실제 질문은 다음과 같습니다.그게 그렇게 중요한 건가?

이것은 또 다른 접근자 생성 모듈입니다.이러한 모듈에는 모두 속도/기능 상충관계가 있습니다.필요한 모든 것을 제공하는 것을 선택하십시오.접근자가 애플리케이션에서 병목 현상을 일으킬 가능성은 없습니다.

@레온 티머만스

속도/기능 상충관계가 있다는 사실을 알고 있지만 그것이 얼마나 좋은지/나쁜지 알고 싶습니다.그리고 더 쉽게 결정하기 위해 구현을 구체적으로 알 수 있다면 훨씬 더 좋습니다.

이전 답변에 더해, 내부적으로 무슨 일이 일어나고 있는지 자세히 확인하려면 추적 모드가 켜져 있는 디버거에서 스크립트를 실행하세요(perl -d filename.pl, 추적하려면 "t"라고 말한 다음 "r"이라고 말하세요). " 스크립트를 실행하려면;그래도 많은 출력을 기대하세요!).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top