- PR -

データ測定ツール

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/12/20
投稿数: 4
投稿日時: 2005-12-20 20:40
今XMLを勉強中なのですが、XMLデータ変換処理に関して、
DOMとSAXの性能比較をするために、
”処理する文字列に対する処理に掛かった時間”をグラフで見易いように表示できる、
いい測定ツールはありますでしょうか、
自分で探せど探せどなかなか見つからず、
ギブアップ寸前でわらにも縋る思いでここに書き込んだ次第です。
ご存知の方は是非にもお教えいただきたいです。
よろしくお願い致します。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-12-21 10:33
検索語の候補は
xml perser BENCHMARK
あたり
performance も使えます

グラフは 数値の表を作り Excel / OpenOffice Calc で
グラフ描画できます

-------------------- 類似例
http://db-www.naist.jp/~makoto-y/misc/xmark/benchmark/
xq_bench.xls

[ メッセージ編集済み 編集者: MMX 編集日時 2005-12-21 12:07 ]
未記入
会議室デビュー日: 2005/12/20
投稿数: 4
投稿日時: 2005-12-21 17:17
早々の丁寧なご返答ありがとうございました。
ご紹介いただいたサイトからツールを入手して勉強がんばります。
勉強を積み重ねて人にも教えられるほどの立ち場になりたいと思います。


どうもありがとうございました。
未記入
会議室デビュー日: 2005/12/20
投稿数: 4
投稿日時: 2006-02-01 16:55
以前はありがとうございました。

教えてもらってから、初心者0の状態から勉強し始め、
OSはXP、JDK1.41のインストール、JAXPのXMLパックをインストール、
crimson.jarをDSK追加をした後、
XMLの文書を作成、JavaでSAX、DOMを作成し、
性能比較を開始しました。
調べた結果、Javaの処理時間は

long st = System.currentTimeMillis();//計測開始
//この間に時間を計りたい処理//
long et = System.currentTimeMillis();//計測終了
System.out.println("elapsed time=" + (et-st)/1000.0 + "sec");//出力表示

で時間を計ることがきました。


SAXの性能は文書を最後まで読み込み、まとめて構造化するDOMよりも早く処理を開始することができるんですが、反面、構造の操作性でDOM劣るということがわかっています。
SAXがDOMよりその操作性に劣るという点に着目し、なんとかSAXの処理をDOMの処理より遅らせよう、またそれをグラフ表示させようとしていますがなかなかうまくいきません。
現在DOMとSAX両方をタグ変換処理で比較していますが、計測では以前SAXの方が早く、XML文書が悪いのか、全く進まずがんじがらめ状態です。


XML→XMLで書き出す、タグ変換を行なうDOMは下のプログラム例

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

class ○○
{

static StringBuffer sb = new StringBuffer();
public static void main(String arg[]) throws Exception
{

long st = System.currentTimeMillis();

DocumentBuilderFactory dbf
= DocumentBuilderFactory.newInstance();
DocumentBuilder db
= dbf.newDocumentBuilder();

Document doc
= db.parse(new FileInputStream("○○.xml"));
Element root = doc.getDocumentElement();
sb.append("<?xml version=\"1.0\" encoding=\"Shift_JIS\" ?>");
sb.append("<○○>");
walk(root);
sb.append("</○○>");
PrintWriter pw = new PrintWriter
(new BufferedWriter
(new FileWriter("○○タグ変換終了結果○○.xml")));
pw.println(sb);
pw.close();

long et = System.currentTimeMillis();
System.out.println("elapsed time=" + (et-st)/1000.0 + "sec");

}
public static void walk(Node n)
{
for(Node ch = n.getFirstChild();
ch != null;
ch = ch.getNextSibling()){

if(ch.getNodeType() == Node.ELEMENT_NODE){
if(ch.getNodeName().equals("○○")){
sb.append("○○>");
walk(ch);
sb.append("</○○>");
}
else if(ch.getNodeName().equals("○○")){
sb.append("<○○>");
walk(ch);
sb.append("</○○>");
}
else if(ch.getNodeName().equals("○○")){
sb.append("<○○>");
walk(ch);
sb.append("</○○>");
}
}
else if(ch.getNodeType() == Node.TEXT_NODE
&& ch.getNodeValue().trim().length() !=0){
sb.append(ch.getNodeValue());
}
}
}
}

XML→XMLで書き出す、タグ変換を行なうSAXのプログラム例
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

class ○○
{
public static void main(String args[]) throws Exception
{
long st = System.currentTimeMillis();

SAXParserFactory spf
=SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SampleHandler5J sh = new SampleHandler5J();
sp.parse(new FileInputStream("○読み込むファイル○.xml"),sh);
long et = System.currentTimeMillis();
System.out.println("elapsed time=" + (et-st)/1000.0 + "sec");

}
}

class SampleHandler5J extends DefaultHandler
{
StringBuffer sb = new StringBuffer();
public void startDocument(){
sb.append("<?xml version=\"1.0\" encoding=\"Shift_JIS\" ?>");
}
public void endDocument(){
try{
PrintWriter pw = new PrintWriter
(new BufferedWriter
(new FileWriter("○○変換後結果○○.xml")));
pw.println(sb);
pw.close();
}catch(Exception e){}
}
public void startElement(String namespaceURI,
String localName,
String qName,
Attributes attrs)
{
if(qName.equals("○○")){
sb.append("<○変換後○>");
}
else if(qName.equals("○○")){
sb.append("<○変換後○>");
}
else if(qName.equals("○○")){
sb.append("<○変換後○>");
}
else if(qName.equals("○○")){
sb.append("<○変換後○>");
}
}

public void endElement(String namespaceURI,
String localName,
String qName)
{
if(qName.equals("○ルート要素○")){
sb.append("</○変換後○>");
}
else if(qName.equals("○1子要素○")){
sb.append("</○変換後○>");
}
else if(qName.equals("○2孫要素○")){
sb.append("</○変換後○>");
}
else if(qName.equals("○3孫以降・・・○")){
sb.append("</○変換後○>");
}
}

public void characters(char[] ch, int start,int length){
String str = new String(ch,start,length);
if(str.trim().length() != 0){
sb.append(str);
}
}
}

上記のプログラムでやってますがさっぱりです。
タグ変換にこだわり過ぎでしょうが、XML文章のタグの量の増減、子要素〜以下の追加、操作法でDOMでSAXの処理速度を追い抜く過程を見たいのですが、
勉強したての初心者の上、今はこれしかわかりませんでした。

XMLができる人にとっては簡単なことで申し訳ないですが、
こういうプログラムがいいんじゃないか?
ここが間違ってるよ、というようなアドバイスがありましたらどうぞよろしくお願いいたします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-02-01 22:17
Document doc = db.parse(new FileInputStream("○○.xml"));
// この地点でも 計測したほうがよい
Element root = doc.getDocumentElement();

DOMの前半と後半を区別してみましょう
未記入
会議室デビュー日: 2005/12/20
投稿数: 4
投稿日時: 2006-02-01 23:48
ご返信ありがとうございます。
先ほどDOMご指摘のあった部分、よく見るとDOMに関しては前半は、
DOMの準備と文書の読み込みの部分で、後半はタグ変換書き込みの部分になってますね。

DOMの前半は処理時間を測りますと大体0.094〜0.11msで後半は0.016〜0.031ms、全体では0.109〜0.140msくらいでした。

一方上記のSAXの方はタグ変換の部分がハンドラクラスの部分にあるので上記の処理タイム計測の関数が使用できないため、文書の読み込みとSAXの準備のみで計測した結果、0.109〜0.14となりました。
今回タグの数が少なかったためにほぼ同じになりましたが、タグの数を増やしたり、タグ変換する階層を深くしたりすれば変わってくるんでしょうかね?
いろいろやってみたんですが、やっぱりSAXの方が早かったりします。
まだまだ自分の勉強不足です。


今回自分自身、プログラムに取り組んだのは初めてで、なかなかわかってくると面白くなるんですが、機械は正直なため、プログラムを組む際、コンマ一つでも書き忘れたら動かなくなるということで結構苦戦してます。
ともあれDOMの性能がSAXの性能を総合的に上回る場合、条件は何か?になんとかたどり着きたいと思います。

その前に、勉強不足の自分のDOMとSAXのイメージなんですが、

例えば、XML文書が@ABCDEFGHのタグの順で並んでいるとしますと、

SAXが逐次処理ということで順に読み込みます。
一方DOMでは、

   @
  / \
 A   F
/ \ / \
B C G H
 / \
D   E

子要素の位置関係が上図であり、DOMツリーはこのような感じになるとします。
(実際にはこの量だと明らかにSAXの方がスピードで勝ると思うのですが、)
例えばHのみのタグ変換したい場合SAXの場合は@からA、B、Cと読見込んでHまで猛スピードで処理します。
一方DOMとしては@FとたどってHだけを取り、タグ変換できれば、SAXがHにたどり着くまでにDOMの処理がHに達すれば、時間においてSAXより先にHを処理できると思うのです。
DOMがSAXに勝る場合のイメージとしては自分はこんな感じに勝手に思いこんでます。
無知の自分がまだまだ気づかない条件もありますが、そんなことが可能なんでしょうか?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-02-03 10:54
変換の区間に関しては、イメージどおりで、いいです。
DOMツリーをメモリ上に構築する処理や、シリアライズ出力の時間はデータ量に比例します。

標準のAPIを使わずに、高性能を追求する人々もいます。
検索語は、binary XML とか、専用LSIを起こしてxmlデータの高速ルーティングとか。
1

スキルアップ/キャリアアップ(JOB@IT)