[첫화면으로]UseModWiki소스수정/처리시간측정

마지막으로 [b]

wiki.pl 이 수행하는데 걸리는 시간을 측정해서 출력

config.pl 화일에 다음 변수를 0 또는 1 로 설정해 준다.
### 페이지 처리 시간을 출력한다
$CheckTime = 0;   # 1 = mesure the processing time (requires Time::HiRes module), 0 = do not

wiki.pl 에서는 다음의 것들을 추가, 수정한다.
    ...
    # $CheckTIme 과 $StartTime 두 변수를 추가한다.
### 패치를 위해 추가된 환경설정 변수
use vars qw(
    $UserGotoBar $UserGotoBar2 $UserGotoBar3 $UserGotoBar4
    $ConfigFile $SOURCEHIGHLIGHT %SRCHIGHLANG $LinkFirstChar
    $EditGuideInExtern $SizeTopFrame $SizeBottomFrame
    $LogoPage $CheckTime
    );
###############
### added by gypark
### 패치를 위해 추가된 내부 전역 변수
use vars qw(%RevisionTs $FS_lt $FS_gt $StartTime);
###
###############
    ...
sub DoWikiRequest {
    ...
    if ($UseConfig && (-f $ConfigFile)) {
        do "$ConfigFile";
    }
###############
### 다음 단락을 추가
### 처리 시간 측정
if ($CheckTime) {
    eval "use Time::HiRes qw( usleep ualarm gettimeofday tv_interval )";
    if ($@) {
        $CheckTime = 0;
    } else {
        $StartTime = [gettimeofday()];
    }
}
###
###############
    &InitLinkPatterns();
    if (!&DoCacheBrowse()) {
        eval $BrowseCode;
        &InitRequest() or return;
        if (!&DoBrowseRequest()) {
            eval $OtherCode;
            &DoOtherRequest();
        }
    }
}
sub GetMinimumFooter {
    ...
    # 아래 라인을 다음과 같이 바꾼다
    # $result .= "\n<div align=\"right\"><a accesskey=\"x\" name=\"#PAGE_BOTTOM\" href=\"#PAGE_TOP\">" . T('Top') . "</a></div>\n" . $q->end_html;
### 처리 시간 측정
    $result .= "\n<div align='right'>";
    if ($CheckTime) {
        $result .= "<i>" . sprintf("%8.3f",&tv_interval($StartTime)) . " sec </i>";
    }
    $result .= "<a accesskey=\"x\" name=\"#PAGE_BOTTOM\" href=\"#PAGE_TOP\">" . T('Top') . "</a></div>\n" . $q->end_html;
###

    return $result;
}

Notes

Time::HiRes 모듈은 어디에나 설치되어 있는 모듈이 아닌 것 같더군요. 애초의 계획은... 사용자가 선택할 필요는 없게 하고, 모듈을 불러오는 것을 동적으로 처리하여, 실패할 경우는 측정 루틴을 수행하지 않도록 하는 것이었습니다. 그 방법을 몰라 며칠 고생했는데... 위 코드에서 eval.. 로 시작하는 부분이 그 부분인데, 간단한 프로그램을 짜서 테스트할 때는 잘 되었는데 (모듈이 있으면 수행, 없으면 스킵하도록) 이 wiki.pl 에 적용했더니만, 모듈이 없을 경우 그냥 시간 측정을 하지 않고 수행이 되기는 하는데 꼭 앞에 서버 에러 메시지가 브라우저로 보내지더군요. -_-; 그래서 브라우저 상단에는 Server Error 메세지가 뜨고, 그 아래에 홈페이지가 제대로 보이는 아주 해괴망칙한 출력이 됩니다. 할 수 없이 CheckTime 환경변수를 도입해서, 저 eval 문을 실행하는 것 자체를 사용자가 결정하도록 넘겨야 했습니다. 그 에러 메시지를 안 나오게 하는 법을 아시는 분들의 제보를 기다립니다~
-- Raymundo 2003-2-16 7:27 pm

Time::HiRes모듈이 설치가 되길래 잘되나 싶었는데, 에러가 나는군요. $CheckTime 변수를 켜놔도 if ($CheckTime)으로 묶인 부분이 출력되지 않았고, 환경변수 체크안하고 그냥 바로 출력하게 하니까 에러가 나는군요 -_-a 으음.. 무슨문제일려나.. make test하니까 체크 잘됐습니다. 근데 tv_interval이란게 어디있는 함수죠?
-- Bab2 2003-2-17 1:03 am

gettimeofday 와 tv_interval 둘 다 HiRes 모듈에 있는 함수겠죠. 흐음.. 직접 모듈을 설치한 경우마저도 그렇게 된다면 문제가 많은 패치로군요... 제 경우는 시스템에 root 권한이 있는 터라 다른 설정을 건드리지 않고 readme 에 있던 대로 그대로 따라해서 한 번에 성공했는데요.. 일단 man Time::HiRes 해서 나오는 예문을 보고 간단한 샘플 코드를 짜서 터미널에서 돌려 보는 게 원인을 찾기 쉬울 것 같네요. 모듈은 제대로 설치되었다 싶으면 다음과 같이 해 보세요.
use Time::HiRes qw( usleep ualarm gettimeofday tv_interval );    # eval 을 쓰지 말고 그대로 use 
$StartTime = [gettimeofday];   # gettimeofday 뒤에 있는 소괄호쌍 제거
gettimeofday 뒤에 소괄호 쌍 가지고 뭐라고 투덜대는 경우가 있더라고요. 그리고, man 페이지에 보니까 시스템에 gettimeofday 시스템콜이 지원되지 않으면 이 모듈의 gettimeofday 함수도 쓸 수 없다는 식으로 나왔더군요. 까다롭기도 하지.. -_-;
-- Raymundo 2003-2-17 1:13 am
흠냐.. 제가 바보짓했군요. make install을 안했네요 -ㅅ-;;;;
-- Bab2 2003-2-17 1:33 am
각주:
1. http://search.cpan.org/~jhi/Time-HiRes-1.56/HiRes.pm 참조

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
1321 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기