FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

Field Reportsの性能測定

Field ReportsがPDFを生成する速度を測定してみました。

測定環境

PC DELL PowerEdge T100
CPU Core 2 Quad Q8400 2.66GHz
Memory 4GB
HDD SATA 160GB
OS Cent OS 5.5

測定方法

Pythonで以下のようなスクリプトを作成してコマンドラインから実行しました。
コマンドライン引数により,作成する帳票のページ数と繰り返し回数を指定できるようになっています。

処理時間の計測には,timeコマンドを使用しました。

用意した帳票は,明細項目が6行ある見積書で,印影の画像を1つ配置しています。

#!/usr/bin/env python
# coding: utf-8

import sys
from field import reports

param = {
    "template": [ {"*": "./mitumori.pdf"} ],
    "context": []
}

context = {
    "date": {"value": "${NOW}", "datetime": "GGEE年MM月DD日"},
    "number": "10R0001",
    "to": "△△△惣菜株式会社",
    "title": "肉じゃがの材料",
    "delivery_date": "平成23年1月22日",
    "delivery_place": "貴社指定場所",
    "payment_terms": "銀行振込",
    "expiration_date": "発行から3ヶ月以内",
    "stamp1": {"icon": "./stamp.png"},
    "table": [
        ["1", "N001", "牛肉(切り落とし)", "200g", "250円", "500円"],
        ["2", "Y001", "じゃがいも(乱切り)", "3個", "30円", "90円"],
        ["3", "Y002", "にんじん(乱切り)", "1本", "40円", "40円"],
        ["4", "Y003", "たまねぎ(くし切り)", "1個", "50円", "50円"],
        ["5", "Y004", "しらたき", "1袋", "80円", "80円"],
        ["6", "Y005", "いんげん", "1袋", "40円", "40円"]
    ],
    "sub_total": "800円",
    "tax": "40円",
    "total": "840円"
}

if __name__ == "__main__":
    if len(sys.argv) == 3:
        reports.set_log_level(0)
        for i in range(int(sys.argv[1])):
            param["context"].append(context)
        for i in range(int(sys.argv[2])):
            print(i)
            reports.render(param, "out.pdf")

帳票イメージ

測定果(1)

合計1,000ページになるように,ページ数と繰り返し回数を調整して実行しました。

頁数 繰り返し回数 1回目(s) 2回目(s) 3回目(s) 平均速度(ms/頁)
1 1,000 43.862 43.614 43.647 43.7
10 100 42.369 42.251 42.310 42.3
100 10 45.552 44.963 45.020 45.2
1,000 1 55.672 55.154 55.815 55.5

印影画像を外したパターンでも測定してみました。

頁数 繰り返し回数 1回目(s) 2回目(s) 3回目(s) 平均速度(ms/頁)
1 1,000 25.577 25.334 25.412 25.4
10 100 23.957 23.987 23.982 24.0
100 10 27.013 26.994 27.480 27.0
1,000 1 34.840 34.985 34.936 34.9

測定結果(2)

長時間運用時の安定性を確認するために,10ページの帳票を100,000回作成しました。

頁数 繰り返し回数 処理時間(s) 処理速度(ms/頁)
10 100,000 40,444.99 40.5

考察

1ページ当たりの処理時間がおおよそ50msということで,まずまずの速度だと思っています。

ページ数が増えるにしたがって処理速度が若干低下する傾向ですが,これがアルゴリズムに依存するものなのか,GCの発生頻度によるものなのか,もう少し調べてみようと思います。

チューニングの類をまったく行っていない状態で,このパフォーマンスと安定性が出せたことは,OCamlに依るところが大きいと思います。あとは,GCが並行化してくれたら言う事ないのですが。