`
geeksun
  • 浏览: 964991 次
  • 性别: 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文档,这一过程对于批量处理数据或动态生成配置文件等场景尤为关键。 ### 核心知识点:C#中循环生成XML文档 #### 1. 初始化XML文档 在C#中,生成XML文档的第一步是创建一...

    vue-for循环嵌套操作示例

    在文档中,我们通过一个具体的示例来展示如何在Vue.js中实现for循环嵌套操作。 首先,文档中提到了什么是for循环嵌套。在计算机编程中,嵌套循环意味着在一个循环体内使用另一个循环,这样就可以处理多层循环结构的...

    for 循环的使用技巧

    在Python中,可以使用`range()`函数生成一个整数序列,供`for`循环遍历,例如`for i in range(5)`会迭代0到4。 **4. 遍历字典:** 在Python中,可以使用`items()`、`keys()`或`values()`方法遍历字典的键值对、键或...

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

    Python中的for循环是编程语言中最常用的控制流结构之一,它用于遍历序列(如列表、元组、字符串)或任何可迭代对象的所有元素。for循环的语法格式如下: ```python for 变量 in 序列或迭代对象: 循环体语句块 ``` ...

    java for循环的几种写法

    在 J2SE 1.5 中,Java 引入了一种新的 for 循环语法,称为“增强的 for 循环”或“foreach 循环”,它提供了一种更简单的方式来遍历数组和 Collection 对象。 传统的 for 循环 在遍历数组时,传统的 for 循环通常...

    测试迭代.zip,迭代器、可迭代对象、生成器、生成器表达式的实验代码

    这种方式可以节省内存,因为生成器不会一次性生成所有结果,而是在需要时逐个产生。 4. **生成器表达式**:生成器表达式类似于列表推导式,但返回的是一个生成器而不是列表。它的语法类似于一个括号包围的数学...

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

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

    For循环嵌套要点和难点具体案例

    在编程领域,循环是控制程序流程的关键结构之一,而for循环作为最常见的循环类型,被广泛应用于各种场景。本文将深入探讨for循环的嵌套及其在实际应用中的要点和难点,帮助开发者更好地理解和运用这一技术。 一、...

    编译原理课程设计FOR循环语句的翻译程序设计+报告

    在编译原理中,我们研究如何将高级编程语言转换为机器可以理解的低级指令集,这个过程通常分为词法分析、语法分析、语义分析和代码生成四个阶段。FOR循环语句是高级语言中常见的一种控制流程结构,用于执行一系列...

    JAVA实现模拟双色球彩票玩法,使用一些Java内置类,for循环等,适合java初学者巩固知识

    通过这个项目,初学者可以加深对Java内置类、控制流(如for循环)以及随机数生成的理解。 1. **Java内置类的运用**: - `Random` 类:用于生成随机数,这是模拟彩票的关键部分。在这个项目中,你需要创建一个`...

    Python for循环生成列表的实例

    在Python编程语言中,`for` 循环是一种常用的控制流结构,用于遍历序列(如列表、元组或字符串)或其他可迭代对象中的每个元素。在这个实例中,我们将探讨如何利用`for`循环来生成新的列表。这种方法被称为列表推导...

    Vue通过for循环随机生成不同的颜色或随机数的实例

    本文将详细介绍如何在Vue中利用`v-for`循环实现这一功能。 首先,我们要解决的问题是生成随机颜色。在JavaScript中,我们可以使用Math.random()函数生成0到1之间的随机数,然后乘以256(颜色的最大取值范围)并向下...

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

    2. 通过for循环遍历生成器,每次循环都会自动调用`next()`函数获取下一个元素,直至遍历结束。 ```python for x in g1: print(x) ``` 或者通过其他生成器对象`g2`执行相同操作: ```python for x in g2: print...

    54.Python之for循环共2页.pdf.zip

    9. **列表推导式**:在某些情况下,for循环可以与列表推导式结合,快速生成新的列表。 通过以上介绍,我们可以看到Python的for循环在处理各种数据结构时的灵活性和便利性。在实际编程中,熟练掌握for循环的使用将极...

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

    ### Python中的可迭代对象、迭代器、For循环工作机制、生成器 #### 一、可迭代对象与迭代器的区别 为了更好地理解Python中的可迭代对象(iterable)与迭代器(iterator),我们首先需要掌握迭代器协议的基础知识。...

    Apache poi 根据word模板生成word报表 替换 循环列表 图片

    在本项目中,我们将关注如何使用Apache POI来根据预设的Word模板生成包含替换内容、循环列表和图片的动态Word报表。 首先,我们需要理解Apache POI的核心概念。在处理Word文档时,POI提供了HWPF(Horrible Word ...

    初学python-day6 for循环和流程控制(已更新循环做三角形图形!!).pdf

    for 循环也可以使用 range 函数生成一个数字序列作为集合。例如,range(5) 将生成一个从 0 到 4 的数字序列。 在 for 循环中,我们可以使用 break 语句来跳出循环体。break 语句的作用是跳出当前循环体,继续执行...

    python基础教程:for循环用法.pdf

    Python中的for循环是一种非常基础且常用的控制流程结构,它用于遍历任何可迭代对象中的元素。在Python中,可迭代对象包括但不限于列表、元组、字符串、字典以及集合等。接下来,我们将深入探讨for循环的用法及其在...

    python的for循环语句range-Python基础教程:for循环语句与range()函数.pdf

    Python中的for循环语句是编程中最常用的控制结构之一,它用于遍历序列或集合中的每个元素。`for ... in`语句是Python中迭代的一种实现,它可以迭代任何可迭代对象,如列表、元组、字符串等。对于初学者来说,理解和...

Global site tag (gtag.js) - Google Analytics