BCL easyPDF SDKていうののベンチマーク取ってみた(続き)

昨日やってみたベンチマークは、ふつうのアプリだったけど、Webアプリでも同じ性能がでるかやってみた。

ベンチマークのルール

jpeg画像をサーバー側にあらかじめ連番で1万件作っておく。名前は0000.jpg〜9999.jpgとする。クライアントから順次変換リクエストを投げて、0000.jpg〜9999.jpgをそれぞれPDFに変換する。名前は0000.pdf〜9999.pdfとする。このPDF変換にかかった時間を計測する。サーブレットコンテナはApache Tomcat 6.0.35 Serverとする。

サーバー側のプログラム

サーバー側のプログラムはこんな感じになった。Tomcatだと自動的にスレッドで処理してくれるので、スレッド処理を自前で実装してた部分を省いた。

import com.bcl.easypdf.*;
import com.bcl.easypdf.EasyPDFPrinter.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PDFprint extends HttpServlet {
    public void doGet (HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        String fileNo = request.getParameter("fileNo");
        String inputFileName = "";
        inputFileName = String.format("C:\\Users\\hide\\Documents\\%s.jpg", fileNo);
        System.out.println(inputFileName);
        String outputFileName = "";
        outputFileName = String.format("C:\\Users\\hide\\Documents\\%s.pdf", fileNo);
        System.out.println(outputFileName);
        EasyPDF.initialize();
        IPrinter printer = new IPrinter();
        IPrintJob pj = printer.getPrintJob();
        pj.PrintOut(inputFileName, outputFileName);
        EasyPDF.uninitialize();
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>\n");
        out.println("<head><title>Servlet Sample</title></head>");
        out.println("<body>");
        out.println(inputFileName);
        out.println(outputFileName);
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
}

クライアント側のプログラム

クライアント側のプログラムは、なるべく早くリクエストを投げるために、スレッドで実行してた部分を流用して、リクエストを投げるようにした。

import java.io.*;
import java.net.*;

class PrintRequest {

  public static void main(String[] args) {
    long timeMillisStart = System.currentTimeMillis();

    // スレッドを32個作成する
    MyThread[] threads = new MyThread[32];
    for (int i = 0; i < 32; i++) {
      threads[i] = new MyThread(i);
      threads[i].start();
    }

    // スレッドがすべて終了するのを待つ
    for (int i = 0; i < 32; i++) {
      try {
        threads[i].join();
      } catch (InterruptedException e) {
        System.out.println(e);
      }
    }

    long timeMillisEnd = System.currentTimeMillis();
    long time = timeMillisEnd - timeMillisStart;
    System.out.println(time + "ms. " + time/1000 + "s" );
  }
}

// スレッド
class MyThread extends Thread {
  int threadNo;
  MyThread(int i){
    threadNo = i;
  }
  public void run(){
    for(int i = 0; i < 10000; i++){
      if(i % 32 == threadNo){
        String requestUrl = "";
        requestUrl = String.format("http://localhost:8080/PDFprint?fileNo=%04d", i);
        System.out.println(requestUrl);
        try {
          URL accessURL = new URL(requestUrl);
          HttpURLConnection con = (HttpURLConnection)accessURL.openConnection();
          con.setRequestMethod("GET");
          con.connect();
          BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
          int data;
          while ( (data = bis.read()) != -1 ) System.out.write(data);
        } catch (java.net.MalformedURLException e){
          e.printStackTrace();
        } catch (java.io.IOException e){
          e.printStackTrace();
        }
      }
    }
  }
}

結果

C:\Users\hide\Documents>java PrintRequest

〜途中省略〜

http://localhost:8080/PDFprint?fileNo=9990
<html>

<head><title>Servlet Sample</title></head>
<body>
C:\Users\hide\Documents\9972.jpg
C:\Users\hide\Documents\9972.pdf
</body>
</html>
<html>

<head><title>Servlet Sample</title></head>
<body>
C:\Users\hide\Documents\9990.jpg
C:\Users\hide\Documents\9990.pdf
</body>
</html>
211650ms. 211s

211秒かかった。だいたい4分足らず。念のため全件できてるか確認してみる。

C:\Users\hide\Documents>dir *.pdf

〜途中省略〜

2012/05/06  15:34           394,675 9990.pdf
2012/05/06  15:34           394,675 9991.pdf
2012/05/06  15:34           394,675 9992.pdf
2012/05/06  15:34           394,675 9993.pdf
2012/05/06  15:34           394,675 9994.pdf
2012/05/06  15:34           394,675 9995.pdf
2012/05/06  15:34           394,675 9996.pdf
2012/05/06  15:34           394,675 9997.pdf
2012/05/06  15:34           394,675 9998.pdf
2012/05/06  15:34           394,675 9999.pdf
           10000 個のファイル       3,946,750,000 バイト
               0 個のディレクトリ  60,136,988,672 バイトの空き領域

できてるっぽい。この処理してる間、タスクマネージャーでCPU使用率見てみた。4コア全てで100%に張り付く感じで推移してた。そのほとんどをTomcatのプロセスが占めてて、easyPDFのプロセスは1%程度だった。

スレッド数について

Tomcat6.0はデフォルトで200までスレッド数を増やしちゃうみたいなので、限界までリクエストを投げちゃうとあぼーんすると思う。クライアント側でリクエストをしぼってやれば、かなりの性能が出る感じ。