0

ビュー コントロールでカスタム フッターを使用しています。たとえば、次のようなものがあります。

34200の1 - 25を表示しています

私の基礎となるビューは分類されているため、エントリの合計にはカテゴリも含まれている必要があります。これまでのところ、カテゴリを含むエントリの合計を見つけることができる唯一の方法は、NotesViewNavigator を使用することです。ただし、このコードの計算には約 27 秒かかるため、パフォーマンスは許容できません。

var nav:NotesViewNavigator = view1.createViewNav();デバッガー情報を追加したため、問題は次の行にあると確信しています。

start = new Date().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel = getComponent("dataView1");
var nav:NotesViewNavigator = view1.createViewNav();
if (viewScope.VendorSrch == "" || viewScope.VendorSrch == null){
    var total =  nav.getCount(); 
}else{          
    var total = viewPanel1.getRowCount();// View can be filtered by user as well (using categoryFilter property)
}

var from =(viewPanel1.getFirst() < total? (viewPanel1.getFirst() + 1 ) : total);
var tmpTo = viewPanel1.getFirst() + viewPanel1.getRows();
var to = (tmpTo < total? tmpTo : total);

var elapsed = new Date().getTime() - start;
print(elapsed + " ms");
"</b>Displaying <b>"+ from +"</b> - <b>"+ to + "</b> of " + "<b>"+total+"</b>"

このコードを改善する方法を知っている人はいますか?

このビューのドキュメントには、この操作のパフォーマンスに影響を与える可能性がある読者フィールドもあることに注意してください。

4

2 に答える 2

3

あなたはパフォーマンス地獄に閉じ込められています。読み取りアクセス保護は、ドキュメント内にのみ保存されます。したがって、ビューナビゲーターにカウントを取得するように依頼すると、関連するすべてのドキュメントを開くしかないため、パフォーマンスが低下します。読み取り保護とパフォーマンスは天敵です (想像してみてください: すべてのドアがロックされているオフィスがあり、移動するために、ロック番号が一致するキーがあるかどうかを毎回確認する必要があります)。

リーダー フィールドに導入されたパフォーマンス地獄から抜け出す方法は、実際に必要なエントリのみを読み取ることです (概説したように)。ユーザーが名前、グループ メンバーシップ、およびロールに基づいてドキュメントにアクセスできる場合 (アクセスごとに 1 つの読み取りが行われる) は少し難しいかもしれませんが、それでも非常に実現可能です。この場合、繰り返しコントロールとオブジェクト データ ソースまたはマネージド Bean を使用するため、バックグラウンドで複数のパスが発生します。

おまけ: 数式 1 (数値のみ) の列を追加して、それを分類しながら合計すると、naventry から次の兄弟 (次のカテゴリ) にジャンプして数値を追加することができます -- > 読み取りがはるかに少なくなり、ドキュメントが開かれません。

もう一度強調します: nav.count はすべてのドキュメントを開く必要があり、悪い考えです。読み取りアクセスをチェックする必要があるものはすべて悪い考えです。読むことができます。

さらにヒントが必要な場合はお知らせください

于 2013-03-19T15:15:24.183 に答える
0

私はいくつかのアプローチを試しましたが、このループを使用すると、時間が平均27秒から2.7秒に短縮されました。

start = new Date().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel = getComponent("dataView1");
var nav:NotesViewNavigator = view1.createViewNav();
nav.setEntryOptions(NotesViewNavigator.VN_ENTRYOPT_NOCOLUMNVALUES);

// disable autoupdate
view1.setAutoUpdate(false);
if (viewScope.VendorSrch == "" || viewScope.VendorSrch == null){
    nav.setBufferMaxEntries(400);       
    //var total =  nav.getCount(); // This works but slow

    // peform lookup
    var vwentry:NotesViewEntry = nav.getFirst();
    var vwentrytmp:NotesViewEntry = null;
    count = 0;
    while (vwentry != null){
        count = count + 1;       
        // Get entry and go recycle
        vwentrytmp = nav.getNext(vwentry);
        vwentry.recycle();
        vwentry = vwentrytmp;        
    }

    total = count;

}else{  
    var total = viewPanel1.getRowCount();   
}

var from =(viewPanel1.getFirst() < total? (viewPanel1.getFirst() + 1 ) : total);
var tmpTo = viewPanel1.getFirst() + viewPanel1.getRows();
var to = (tmpTo < total? tmpTo : total);

var elapsed = new Date().getTime() - start;
print(elapsed + " ms");
"</b>Displaying <b>"+ from +"</b> - <b>"+ to + "</b> of " + "<b>" + total + "</b>"
于 2013-03-19T19:09:49.557 に答える