문제
Class::MethodMaker를 통해 생성된 getter/setter가 호출될 때 발생하는 호출 순서가 정확히 무엇인지 알고 싶습니다.
MethodMaker에서 정의한 getter/setter는 기본 항목(모듈에서 덮어쓰기)보다 비용이 얼마나 더 듭니까?
해결책
Class::MethodMaker 성능에 관한 귀하의 질문에 대한 간단한 답변이 없습니다.이전 답변에서 언급했듯이 디버거를 사용하여 내부에서 무슨 일이 일어나고 있는지 확인할 수 있습니다.그러나 나는 Class::MethodMaker가 생성한다는 것을 알고 있습니다. 거대한 설치 시 코드의 양.이는 나에게 세 가지 개별적인 사항을 나타냅니다.
- 런타임에 관해서는, 아마 수많은 메소드 생성기 중 더 빠른 측면에 있습니다.그렇지 않으면 설치 시 많은 코드를 생성하는 이유는 무엇입니까?
- 디스크에 O(메가바이트)의 코드를 설치합니다!
- 간단한 사용 사례를 위해 생성된 코드의 어떤 부분이 로드되는지에 따라 컴파일 시간이 느려질 수 있습니다.
정말로 필요한 것이 무엇인지 생각하려면 몇 분 정도 시간을 투자해야 합니다.간단한 접근자 메서드를 자동 생성하고 싶지만 더 복잡한 것을 직접 작성하려면 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"이라고 말하세요). " 스크립트를 실행하려면;그래도 많은 출력을 기대하세요!).