`
geeksun
  • 浏览: 954115 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在for循环前只生成一次对象可以吗?

阅读更多

本人目前遇到的一个问题,在公司眼前跑的系统中,有一个项目中设了两个定时器,每天到定时的时候严重影响服务器性能,致使CPU的占有率达到了100%,有时会宕机,我修改了一下跑定时的程序,如下:

SeoPageTextsBean  pageTextBean = new SeoPageTextsBean();
int len = pageTexts.size();

for (int i=0;i<len;i++)
{
TSeoPageTexts seoPageText = (TSeoPageTexts) pageTexts.get(i);
String pageUrl = seoPageText.getPageUrl();
if (pageUrl!=null&&!"".equals(pageUrl))
{
pageTextBean.setPageUrl(pageUrl);
pageTextBean.setTitle(seoPageText.getTitle());
pageTextBean.setDescription(seoPageText.getDescription());
pageTextBean.setKeywords(seoPageText.getKeywords());
pageTextBean.setH1Text(seoPageText.getH1Text());
pageTextBean.setTopText(seoPageText.getTopText());
pageTextBean.setH2Text(seoPageText.getH2Text());
pageTextBean.setLeftText(seoPageText.getLeftText());
pageTextBean.setBottomText((seoPageText.getBottomText()));

String url =AnalyseUrl.analyse(pageTextBean.getPageUrl());
if (url!=null)
{
url =url.toLowerCase().trim();
    if ("".equals(url)){
    if(log.isInfoEnabled()){
    log("======分析后结果为空字符!===== 原url串为: "+pageTextBean.getPageUrl());
    }
    }
    else{	 SEOPageTexts.SEO_Page_Texts_Map.put(url,pageTextBean );
        }
    }    
}
}

 
请注意这句 SeoPageTextsBean  pageTextBean = new SeoPageTextsBean(); ,我把SeoPageTextsBean对象的生成写在for循环的前边,因为从程序优化的角度考虑,这样可以在程序中只生成一次SeoPageTextsBean的实例,比在for循环中不断地生成新实例的性能上会减少开销,在本机上测试,pageTextBean 在for循环中也有值,就是不知道这样的写法在程序run的时候会不会有什么bug存在,这个请有这方面经验的Jer们给予建议,希望大家能畅所欲言,各抒已见。

分享到:
评论
4 楼 geeksun 2009-04-27  
另外,检查下是不是pageTexts太大了,如果太大了,则需要开一个单独的线程来进行处理,没处理1000(假设值)就sleep一次
这句作何解释?
3 楼 geeksun 2009-04-27  
多谢上面两位,
# //------------------这段代码可以考虑用BeanUtil代替------------------- 
#     SeoPageTextsBean pageTextBean = new SeoPageTextsBean(); 
#     pageTextBean.setPageUrl(pageUrl); 
#     pageTextBean.setTitle(seoPageText.getTitle()); 
#     pageTextBean.setDescription(seoPageText.getDescription()); 
#     pageTextBean.setKeywords(seoPageText.getKeywords()); 
#     pageTextBean.setH1Text(seoPageText.getH1Text()); 
#     pageTextBean.setTopText(seoPageText.getTopText()); 
#     pageTextBean.setH2Text(seoPageText.getH2Text()); 
#     pageTextBean.setLeftText(seoPageText.getLeftText()); 
#     pageTextBean.setBottomText((seoPageText.getBottomText())); 
#     //---------------------------------------------------------------
这段程序我现在改为用 BeanUtils来操作啦,现在对程序明白了许多。
2 楼 vlinux 2009-04-24  
看到这样的代码我每次都有想按照自己的风格重新排版的冲动,同时修正了会造成所有Map都引用同一个对象的BUG
可以很明确的说,这段代码如果真的有效率问题,也不会是因为循环语句导致的开销太大
1.检查AnalyseUrl.analyse(pageUrl);
2.检查SEOPageTexts.SEO_Page_Texts_Map.put(url,pageTextBean );
*3.检查是否是由于所有Map都引用同一个对象造成的


for(TSeoPageTexts seoPageText : pageTexts) {
	String pageUrl = seoPageText.getPageUrl();
	if( null == pageUrl || "".equals(pageUrl) ) {
		continue;
	}//if
	String url = AnalyseUrl.analyse(pageUrl);
	if( null == url ) {
		continue;
	}//if
	url = url.toLowerCase().trim();
	//------------------这段代码可以考虑用BeanUtil代替-------------------
	SeoPageTextsBean pageTextBean = new SeoPageTextsBean();
	pageTextBean.setPageUrl(pageUrl);
	pageTextBean.setTitle(seoPageText.getTitle());
	pageTextBean.setDescription(seoPageText.getDescription());
	pageTextBean.setKeywords(seoPageText.getKeywords());
	pageTextBean.setH1Text(seoPageText.getH1Text());
	pageTextBean.setTopText(seoPageText.getTopText());
	pageTextBean.setH2Text(seoPageText.getH2Text());
	pageTextBean.setLeftText(seoPageText.getLeftText());
	pageTextBean.setBottomText((seoPageText.getBottomText()));
	//---------------------------------------------------------------
	if ("".equals(url)){
		logger.info("AnalyseUrl分析后结果为空字符,原url串为: "+pageUrl);
	} else {
		SEOPageTexts.SEO_Page_Texts_Map.put(url,pageTextBean );
	}//if
}//for


另外,检查下是不是pageTexts太大了,如果太大了,则需要开一个单独的线程来进行处理,没处理1000(假设值)就sleep一次
1 楼 luckaway 2009-04-24  
放在外面还是每次都会创建SeoPageTextsBean!



而且是你这样写,程序是有错的!

put到Map里是同一个对象!Map里的所有元素都引用同一个对象!

相关推荐

    c# 循环生成XML方法

    基于C#下的循环生成XML的方法,仅供学习参考。

    Python for循环与range函数的使用详解

    For … in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(Iterates),即它会遍历序列中的每一个项目 注意: 1、else 部分是可选的。当循环中包含它时,它循环中包含它时,它总会在 for 循环结束后开始...

    Python语言基础:for循环语句.pptx

    语法格式: for 取值in序列或迭代对象: 语句块 在for循环中,可遍历一个序列或迭代对象的所有元素。...函数range(M,N)会生成一个M到(N-1)个数字列表,for循环就会循环N-1-M次,循环语句块会执行N-1-M。

    Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)

    数据结构为数组中包含对象–树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据。本文为用Vue实现方式,另有一篇为用knockout.js的实现方法。 ...

    Python学习笔记之For循环用法详解

    可迭代对象是每次可以返回其中一个元素的对象, 包括字符串、列表和元组等序列类型,以及字典和文件等非序列类型。还可以使用迭代器和生成器定义可迭代对象 For 循环示例: # iterable of cities cities = ['new york...

    浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器

    主要介绍了Python中的可迭代对象、迭代器、For循环工作机制、生成器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Python通过for循环理解迭代器和生成器实例详解

    本文实例讲述了Python通过for循环理解迭代器和生成器。分享给大家供大家参考,具体如下: 迭代器 可迭代对象 通过 for…in… 循环依次拿到数据进行使用的过程称为遍历,也叫迭代。我们把可以通过 for…in… 语句...

    python循环次数表达.docx

    在for循环中,我们可以使用range()函数来生成一个数字序列。range()函数有三个参数:起始值、终止值和步长。如果省略起始值,python循环次数表达全文共7页,当前为第2页。python循环次数表达全文共7页,当前为第2页...

    python列表生成式与列表生成器的使用

    会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如果需要获取数据,可以使用next()函数来获取,但是需要注意,一旦next()函数获取不到数据,会导致出现StopIteration异常错误,可以使用for循环遍历...

    Python for循环中的陷阱详解

    前言 Python 中的 for 循环和其他语言中的 for 循环工作方式是不一样的,今天就带你深入了解 Python 的 for 循环,看看它是如何工作的,以及它为...我们可以将这个生成器对象传递给元组构造器,从而可以得到一个元组:

    java语言与面向对象程序设计作业题与参考答案汇编.doc

    A、const B、NULL C、false D、this E、native 答案:A"C"D"E 判断题 第14题 对象可以赋值,只要使用赋值号(等号)即可,相当于生成了一个各属性与赋值对象相 同的新对象。 答案:错误 第15题 Java的字符类型采用...

    无监督__生成模型.zip

    DRAW:一个用于图像生成的循环神经网络 DRAW: A recurrent neural network for image generation (2015) 作者K. Gregor et al. 生成对抗网络 Generative adversarial nets (2014) 作者I. Goodfellow et al. 自编码...

    Halcon读取图片

    2.读取多张图片:方法1:声明一个放文件地址的数组,并初始化,for循环遍历(文件路径)。3.连接摄像机读取图像并生成代码:助手--&gt;image Acquization--&gt;检测(用笔记本摄像头)--&gt;点击“实时”(图像就...

    Python3如何使用range函数替代xrange函数

    由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。 在 Python 3 中,range() 是像 ...

    Parfor 的等待栏:等待栏或等待 parfor 或 for 循环的消息。-matlab开发

    基本上,我们需要在循环之前构造对象,向循环内的对象发送消息,并在循环之后销毁对象。 %例子: N = 100000; WaitMessage = parfor_wait(N, 'Waitbar', true); parfor i = 1: N WaitMessage.Send; 暂停(0.002...

    PHP快速生成图片验证码并且实现验证插件.rar

    使用此插件用户可以根据自己网站的需求来拓展验证码字符的范文,将所需要拓展的字符放在$chars中即可,同时需要在for循环中做相应的调整。 注意确保$bg_flie的路径文件地址为验证码背景图片的地址。 验证码图片的...

    pyhon集合,切片,生成器等演示

    pyhon集合,切片,生成器等演示 # for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是# list还是其他数据类型.......

    详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。...这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 1|2判断是否可以迭代 可以使用 isinstance() 判断一个对象是否是 Itera

    你必须知道的495个C语言问题

    1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 *1.26 main的正确定义是什么?voidmain正确吗? 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 1.28 文件...

Global site tag (gtag.js) - Google Analytics