wiki.pl 이 수행하는데 걸리는 시간을 측정해서 출력
- 역링크 목록을 만드는 시간을 제대로 측정하려다보니 추가된 기능
- wiki.pl 의 수행시간을 측정하여 웹페이지 하단에 밀리세컨드 단위로 출력함
- 필수 요구 사항:
- Time::HiRes 모듈이 시스템에 설치되어 있어야 한다. - [다운로드].
- 추가 요구 사항: 없음
- 사용법
- config.pl 에 $CheckTime 변수가 1 이면 시간을 측정하여 출력한다. 0 이면 측정하지 않는다.
- 페이지 하단의 "처음으로" 링크 왼쪽에 측정한 시간을 표시한다.
- Time::HiRes 모듈이 설치되어 있지 않더라도, $CheckTime = 0 으로 설정해 두면 상관없다.
- 부작용: 별로...
- Time::HiRes 모듈이 설치되어 있지 않은 상태에서 $CheckTime = 1 로 하였을 경우, 웹페이지가 뜨기는 하나 상단에 에러 메세지가 출력되어 버린다. (개선 요망)
- config.pl 화일에 다음 변수를 0 또는 1 로 설정해 준다.
$CheckTime = 0;
- wiki.pl 에서는 다음의 것들을 추가, 수정한다.
...
use vars qw(
$UserGotoBar $UserGotoBar2 $UserGotoBar3 $UserGotoBar4
$ConfigFile $SOURCEHIGHLIGHT %SRCHIGHLANG $LinkFirstChar
$EditGuideInExtern $SizeTopFrame $SizeBottomFrame
$LogoPage $CheckTime
);
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'>";
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 문을 실행하는 것 자체를 사용자가 결정하도록 넘겨야 했습니다. 그 에러 메시지를 안 나오게 하는 법을 아시는 분들의 제보를 기다립니다~
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 );
$StartTime = [gettimeofday];
- gettimeofday 뒤에 소괄호 쌍 가지고 뭐라고 투덜대는 경우가 있더라고요. 그리고, man 페이지에 보니까 시스템에 gettimeofday 시스템콜이 지원되지 않으면 이 모듈의 gettimeofday 함수도 쓸 수 없다는 식으로 나왔더군요. 까다롭기도 하지.. -_-;
- 흠냐.. 제가 바보짓했군요. make install을 안했네요 -ㅅ-;;;;
--
Bab2 2003-2-17 1:33 am