[求助] for循环优化

Tom_Xizi 2013-08-30 05:57:49
            int i,j;
String[] fields,values;
FieldBean fieldBean;
for (i = 0; i < topDocs.scoreDocs.length; i++) {
Document document = indexSearcher.doc(topDocs.scoreDocs[i].doc);

fields = new String[document.getFields().size()];
values = new String[document.getFields().size()];
for (j = 0; j < document.getFields().size(); j++) {
IndexableField indexableField = document.getFields().get(j);
fields[j] = indexableField.name();
values[j] = indexableField.stringValue();

highlighter.setTextFragmenter(new SimpleFragmenter(values[j].length()));
String fragment = highlighter.getBestFragment(AnalyzerFactory.getAnalyzerInstance(PropertyConfiguration
.create()), fields[j], values[j]);
if (null != fragment && !fragment.equals("")) {
values[j] = fragment;
}
}
fieldBean = new FieldBean();
fieldBean.setFields(fields);
fieldBean.setValues(values);
fieldBeanList.add(fieldBean);
}


寻求这段for循环如何优化。外层循环数量 > 100,内层循环固定 < 100.
...全文
862 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
郑涛 2013-10-12
  • 打赏
  • 举报
回复
循环次数多的放内部循环,减少虚拟机栈切换开销;还有:for(int i=0,len=list.size();i<len;i++){},减少方法调用, 上面都是小技巧,主要看你目的,问自己:你创建的每个对象,每个申明都是必须的吗?逻辑优化是最重要的
gggggame 2013-09-09
  • 打赏
  • 举报
回复
new String[document.getFields().size() 每执行一回都要占内存的  别的也看不出什么,个别方法也不晓得你是做什么用的
gageinfo 2013-09-06
  • 打赏
  • 举报
回复
for (i = 0,int length1=topDocs.scoreDocs.length; i < length1; i++) { Document document = indexSearcher.doc(topDocs.scoreDocs[i].doc); 别每次都取,效率不好。 List<xxx> xxxList = topDocs.scoreDocs[i];下次直接用xxxList,下面的代码反复出这个问题。
田有朋 2013-09-02
  • 打赏
  • 举报
回复
是的,这样不用每次循环都获取执行一次获取length的代码,其他的优化还没有详细的来看,大体看来其他没有什么可优化的吧
Tom_Xizi 2013-09-02
  • 打赏
  • 举报
回复
引用 2 楼 dreamrealised 的回复:
int i,j; String[] fields,values; FieldBean fieldBean; for (i = 0,int length1=topDocs.scoreDocs.length; i < length1; i++) { Document document = indexSearcher.doc(topDocs.scoreDocs[i].doc); fields = new String[document.getFields().size()]; values = new String[document.getFields().size()]; for (j = 0,int length2= document.getFields().size(); j <length; j++) { IndexableField indexableField = document.getFields().get(j); fields[j] = indexableField.name(); values[j] = indexableField.stringValue(); highlighter.setTextFragmenter(new SimpleFragmenter(values[j].length())); String fragment = highlighter.getBestFragment(AnalyzerFactory.getAnalyzerInstance(PropertyConfiguration .create()), fields[j], values[j]); if (null != fragment && !fragment.equals("")) { values[j] = fragment; } } fieldBean = new FieldBean(); fieldBean.setFields(fields); fieldBean.setValues(values); fieldBeanList.add(fieldBean); }
只是修改for的length吗?
Tom_Xizi 2013-09-02
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
没说清楚命题。 原代码的目的是啥?向往哪个方向优化?
源代码的目的就是解析一个二维的集合。 优化当然是效率了。
  • 打赏
  • 举报
回复
这个没什么好优化的吧,。。一般都是先把循环变量的topDocs.scoreDocs.length取出来用变量来替换。 另外楼主 ,你用的什么分词器??在实现中文和字母 ,数字匹配的时候效果好吗??主要是针对最有匹配项是否是在最上面实现。 能否提供一些好的资料参考一下,感激不尽。。。。
田有朋 2013-08-30
  • 打赏
  • 举报
回复
int i,j; String[] fields,values; FieldBean fieldBean; for (i = 0,int length1=topDocs.scoreDocs.length; i < length1; i++) { Document document = indexSearcher.doc(topDocs.scoreDocs[i].doc); fields = new String[document.getFields().size()]; values = new String[document.getFields().size()]; for (j = 0,int length2= document.getFields().size(); j <length; j++) { IndexableField indexableField = document.getFields().get(j); fields[j] = indexableField.name(); values[j] = indexableField.stringValue(); highlighter.setTextFragmenter(new SimpleFragmenter(values[j].length())); String fragment = highlighter.getBestFragment(AnalyzerFactory.getAnalyzerInstance(PropertyConfiguration .create()), fields[j], values[j]); if (null != fragment && !fragment.equals("")) { values[j] = fragment; } } fieldBean = new FieldBean(); fieldBean.setFields(fields); fieldBean.setValues(values); fieldBeanList.add(fieldBean); }
MiceRice 2013-08-30
  • 打赏
  • 举报
回复
没说清楚命题。 原代码的目的是啥?向往哪个方向优化?

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧