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%程度だった。