0

我在我的视图控件上使用自定义页脚;例如,我有:

显示1 - 2534200

我的基础视图是分类的,因此条目总数也应包括类别。到目前为止,我能够找到包括类别在内的条目总数的唯一方法是使用 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

你被困在性能地狱中。读取访问保护仅且仅存储在文档内部。因此,当您要求视图导航器获取计数时,它唯一的选择是打开所有相关文档 - 因此性能不佳。读取保护和性能是天敌(想象一下:你有一个办公室,每扇门都被锁上了,如果你有一个与锁号匹配的钥匙,你必须每次都检查所有的钥匙)。

读者领域引入性能地狱的出路是只阅读您实际需要的条目(如概述)。如果用户可以根据名称、组成员资格和角色访问文档(这将使每次访问只能读取一次),这可能会有点棘手,但它仍然非常可行。在这种情况下,您将使用重复控件和对象数据源或托管 bean,因此多次传递发生在后台。

额外技巧:如果您添加一个带有公式 1 的列(只是数字)并将其相加,同时对其进行分类,那么您可以从 naventry 跳到下一个兄弟(这将是下一个类别)并添加数字 - > 所涉及的读取次数要少得多,并且没有打开任何文档。

再次强调:nav.count 需要打开所有文档,这是一个坏主意,任何需要检查读取权限的东西都是一个坏主意,因此使用一个(或多个)基于访问权限的 viewNav 实际上只读取用户的文档可以阅读是要走的路。

如果您需要更多提示,请告诉我

于 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 回答