[첫화면으로]Perl/Archive-Zip

마지막으로 [b]

Cpan:Archive::Zip

Zip 압축파일을 만들거나 풀 때 사용하는 모듈.

1. 반복적인 read() 호출과 extract() 관련 문제점
1.1. 실험1
1.2. 실험2
1.3. 실험3
1.4. 실험4 - 매번 객체 만들기
1.5. 중간 결론
2. 기타 & Comments

1. 반복적인 read() 호출과 extract() 관련 문제점

[스무번째 날: Gearman 사용 사례 -- 펄 크리스마스 달력 #2013] 기사를 작성하는 도중에 발견.

1.1. 실험1

일단 한 번만 read()하고, 루프를 돌며 2만번 extract()하는 테스트.

# Archive::Zip 오브젝트 생성
my $zip = Archive::Zip->new();

# 압축 파일을 한번만 읽고
$zip->read($file) == AZ_OK;

for my $num ( 1 .. 20000 ) {
    # 특정 파일을 추출을 2만번 반복
    $zip->extractMemberWithoutPaths($member);
}

전체 코드는 길어서 접음

결과:

1000, 0.000000, 0.000742    <-- 매 천 번 반복하는 동안 read()와 extract..()의 평균 실행 시간
2000, 0.000000, 0.000750
3000, 0.000000, 0.000746
4000, 0.000000, 0.000768
5000, 0.000000, 0.000772
6000, 0.000000, 0.000771
7000, 0.000000, 0.000756
8000, 0.000000, 0.000649
9000, 0.000000, 0.000626
10000, 0.000000, 0.000754
11000, 0.000000, 0.000764
12000, 0.000000, 0.000764
13000, 0.000000, 0.000583
14000, 0.000000, 0.000658
15000, 0.000000, 0.000495
16000, 0.000000, 0.000514
17000, 0.000000, 0.000608
18000, 0.000000, 0.000589
19000, 0.000000, 0.000708
20000, 0.000000, 0.000760
  time    vsz (  diff)    rss (  diff) shared (  diff)   code (  diff)   data (  diff)
     0  94868 ( 94868)   8920 (  8920)   2068 (  2068)   1412 (  1412)   7136 (  7136) before loop
    14  94868 (     0)   8968 (    48)   2096 (    28)   1412 (     0)   7136 (     0) after loop

1.2. 실험2

이번에는 2만번 루프를 돌면서 매번 read()하고 extract()하는 테스트.

# Archive::Zip 오브젝트 생성
my $zip = Archive::Zip->new();

for my $num ( 1 .. 20000 ) {
    # 압축 파일을 매번 읽고
    $zip->read($file);

    # 특정 파일을 추출
    $zip->extractMemberWithoutPaths($member);
}

전체 코드 - 길어서 접음

결과:

1000, 0.000462, 0.000902
2000, 0.000469, 0.001179
3000, 0.000461, 0.001391
4000, 0.000450, 0.001615
5000, 0.000409, 0.001711
6000, 0.000355, 0.001777
7000, 0.000351, 0.001891
8000, 0.000394, 0.002372
9000, 0.000403, 0.002621
10000, 0.000384, 0.002761
11000, 0.000334, 0.002657
12000, 0.000383, 0.003267
13000, 0.000389, 0.003607
14000, 0.000453, 0.004447
15000, 0.000339, 0.003767
16000, 0.000423, 0.004907
17000, 0.000402, 0.005094
18000, 0.000412, 0.005584
19000, 0.000437, 0.006368
20000, 0.000446, 0.006684
  time    vsz (  diff)    rss (  diff) shared (  diff)   code (  diff)   data (  diff)
     0  94872 ( 94872)   8884 (  8884)   2036 (  2036)   1412 (  1412)   7140 (  7140) before loop
    74  173532 ( 78660)  87472 ( 78588)   2096 (    60)   1412 (     0)  85800 ( 78660) after loop

Upload:extractMemberWithoutPaths.png
(실험1과 실험2에서 extract 함수의 실행시간 비교)

1.3. 실험3

이건 확인 차원에서, 반대로 read 만 2만번 반복하게 한 것.

# Archive::Zip 오브젝트 생성
my $zip = Archive::Zip->new();

for my $num ( 1 .. 20000 ) {
    # 압축 파일을 매번 읽고, 추출은 하지 않음
    $zip->read($file);
}

전체 코드 - 길어서 감춤

결과:

1000, 0.000449, 0.000000
2000, 0.000444, 0.000000
3000, 0.000442, 0.000000
4000, 0.000444, 0.000000
5000, 0.000442, 0.000000
6000, 0.000446, 0.000000
7000, 0.000443, 0.000000
8000, 0.000449, 0.000000
9000, 0.000446, 0.000000
10000, 0.000422, 0.000000
11000, 0.000355, 0.000000
12000, 0.000286, 0.000000
13000, 0.000285, 0.000000
14000, 0.000287, 0.000000
15000, 0.000286, 0.000000
16000, 0.000296, 0.000000
17000, 0.000303, 0.000000
18000, 0.000308, 0.000000
19000, 0.000327, 0.000000
20000, 0.000445, 0.000000
  time    vsz (  diff)    rss (  diff) shared (  diff)   code (  diff)   data (  diff)
     0  94868 ( 94868)   8880 (  8880)   2036 (  2036)   1412 (  1412)   7136 (  7136) before loop
     8  171756 ( 76888)  85876 ( 76996)   2076 (    40)   1412 (     0)  84024 ( 76888) after loop

1.4. 실험4 - 매번 객체 만들기

생각해보니까, 정작 이 테스트를 빼먹었다. 루프를 2만 번 돌면서 매번 Archive::Zip 객체를 새로 생성해서 사용하자.

for my $num ( 1 .. 20000 ) {
    # Archive::Zip 오브젝트를 매번 생성
    my $zip = Archive::Zip->new();

    # 압축 파일을 매번 읽고
    $zip->read($file);

    # 특정 파일을 추출
    $zip->extractMemberWithoutPaths($member);
}

전체 코드 - 길어서 감춤

결과:

1000, 0.000419, 0.000705
2000, 0.000361, 0.000610
3000, 0.000412, 0.000692
4000, 0.000428, 0.000721
5000, 0.000457, 0.000770
6000, 0.000459, 0.000787
7000, 0.000475, 0.000797
8000, 0.000421, 0.000705
9000, 0.000428, 0.000721
10000, 0.000424, 0.000715
11000, 0.000418, 0.000706
12000, 0.000439, 0.000735
13000, 0.000388, 0.000636
14000, 0.000478, 0.000790
15000, 0.000456, 0.000777
16000, 0.000433, 0.000727
17000, 0.000425, 0.000721
18000, 0.000322, 0.000543
19000, 0.000392, 0.000655
20000, 0.000395, 0.000665
  time    vsz (  diff)    rss (  diff) shared (  diff)   code (  diff)   data (  diff)
     0  94872 ( 94872)   8884 (  8884)   2036 (  2036)   1412 (  1412)   7140 (  7140) before loop
    24  94872 (     0)   8976 (    92)   2096 (    60)   1412 (     0)   7140 (     0) after loop

1.5. 중간 결론

2. 기타 & Comments

이름:  
Homepage:
내용:
 

컴퓨터분류

마지막 편집일: 2013-12-20 5:52 pm (변경사항 [d])
1322 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기