こんにちは、ねこです。

自称プログラマのおばちゃんのブログです。いろいろあるよねぇ~。

resolveNode と for loopのベンチテスト - どっちが早い? 

2014-01-08 11:53:10 | Designer javascript

今回はパフォーマンスを比べてみようと思います。

ご存知、resolveNodeとresolveNodesはノードの検索をかねてます。

resolveNodeの方は単一のノード
resolveNodesの方はひとつ以上のノードになります。ご存知のように、resolveNodes("test[*]")やresolveNodes("test[5]")と書けても、resolveNode("test[*]")やresolveNode("test[5]")とはかけません。Xpathのシンタックスです。

そして、

var targetRows = xfa.resolveNode("$data.root.l").resolveNodes("m.(s1.value == 'searchCriteria')");
や、
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value == 'searchCriteria')");
としてほしいノードの値を得ることができます。

でもこれって、ループでもできるよねぇ。で、こんな感じ。

var chk = xfa.resolveNodes("$data.root.l.m[*]");
var farray = [];
var fi = 0;

for (i=0; i<chk.length; i++){

if (chk.item(i).s1.value == 'searchCriteria'){
farray[fi] = chk.item(i);
fi++;
}

}

では、どっちが早いでしょう、。。
<u>答えはループのほうがほんの少し早いだけであんま変わりません。



こちら、XMLの構造

<root>
<l>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<m>
<s1></s1>
<s2></s2>
<s3></s3>
<m>
<l>
</root>


//////////TEST Paformance Time. (One line)
var start = new Date();
var targetRows = xfa.resolveNode("$data.root.l").resolveNodes("m.(s1.value == 'searchCriteria')");

if (targetRows.length > 0){

var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(targetRows.length + " line(s) : "+String(diff));

}

//////////TEST Paformance Time. (One line)
var start = new Date();
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value == 'searchCriteria')");

if (targetRows.length > 0){

var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(targetRows.length + " line(s) : "+String(diff));

}



//////////TEST Paformance Time.(Loop)
var start = new Date();
var chk = xfa.resolveNodes("$data.root.l.m[*]");
var farray = [];
var fi = 0;

for (i=0; i<chk.length; i++){

if (chk.item(i).s1.value == 'searchCriteria'){
farray[fi] = chk.item(i);
fi++;
}

}
var end = new Date();
var diff = end.getTime() - start.getTime();
xfa.host.messageBox(fi + " time(s) : "+String(diff));


========================================================================

でもね、こんなテクがresolveNodesならできるんです。

こちらフォームのなんかのイベント。

if (this.rawValue != null){
//dataDOMでsearchCriteriaとsearchCriteria2の両方の検索
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value.toUpperCase().indexOf('"+searchCriteria.rawValue.toUpperCase+"')>=0 || s2.value.toUpperCase().indexOf('"+searchCriteria2.rawValue.toUpperCase+"')>=0)");

}else{

//dataDOMでデータがないものを検索
var targetRows = xfa.resolveNodes("$data.root.l.m.(s1.value==null>=0 || s2.value==null)>=0)");

}
ここでtargetRowsとして検索結果を直接functionへ送る
showtargetRows.targetRowsScript(targetRows);




以下、送られた先のfunction。

function targetRowsScript(targetRows){

for (i=0; i
_dsp.addInstance(0);
var newLine = xfa.resolveNodes("dummyNode[*]").item(main._dummyNode.count - 1);
newLine.s1.rawValue = targetRows.item(i).s1.value;
newLine.s2.rawValue = targetRows.item(i).s2.value;
newLine.s3.rawValue = targetRows.item(i).s3.value;

}

これで、検索の結果がすべてひと塊のデータノードとして形成されるので、データ全体を表示したくないときにページで振り分けて表示したりできます。

なんか、もっと詳しく書きたかったなぁ。
今日は半ちゃんで、もう帰ります。

半ちゃんって、死語?

ねこでした。