`
elite20130514
  • 浏览: 48251 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

读编写高质量代码整理(三)-性能

阅读更多

先在下面代码:

 

package performance;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PerformanceTest {
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		int num = 100*10000;
		List container = new ArrayList();
		for(int i=0;i<num;i++) {
			container.add(new Random().nextInt(150));
		}
		
		long start = System.currentTimeMillis();//记录开始时间
		System.out.println("平均数是:"+average(container));
		System.out.println("平均时间:"+(System.currentTimeMillis()-start)+"ms");
		
		long start2 = System.currentTimeMillis();//记录开始时间
		System.out.println("平均数是:"+average2(container));
		System.out.println("平均时间:"+(System.currentTimeMillis()-start2)+"ms");
	}
	//计算平均数
	public static int average(List<Integer> list) {
		int sum = 0;
		for(int i=0;i<list.size();i++) {
			sum+=list.get(i);
		}
		return sum/list.size();
	}
	//计算平均数
	public static int average2(List<Integer> list) {
		int sum = 0;
		for(int i : list) {
			sum+=i;
		}
		return sum/list.size();
	} 
}

输出结果:

平均数是:74
平均时间:23ms
平均数是:74
平均时间:38ms

 question:为什么两种循环的效率相差这么多

我是一个java菜鸟,我写代码的时候看心情的,想到写那个就写那个,以为效率都差不多,没想到。。。呜呜,菜鸟受打击了~

读了Api后才知道ArrayList实现了RandomAccess接口(随机访问呢),这是一个标志性接口,无需任何实现。

foreach方式是iterator(迭代器)的变形用法,等价于

for(Iterator<Integer> iter = list.iterator();i.hashNext;) {
			sum+=i.next();
		}

 迭代器是23种设计模式中的一种,“提供中方法访问一个容器对象的各个元素,同时无需暴露该对象的内部细节”,需要创建一个迭代器容器,然后屏蔽内部细节。但是ArrayList实现了RandomAccess接口,以表明两个对象没有关系,但迭代器缺需要判断是否有下个元素,以及下一个元素是什么等关系,这就是foreach遍历耗时的原因。同理,如果对象之间是有关系的,即是List实现类不是随机存取的,比如LinkedList类,它是一个双向链表,previous node - current node -next node ,此时,使用foreach迭代效率更高。有兴趣的可看下LinkedList的api。重构average方法:

//重构后的方法
	public static int average3(List<Integer> list) {
		int sum = 0;
		if(list instanceof RandomAccess) {
			for(int i=0;i<list.size();i++) {
				sum+=list.get(i);
			}
		}else{
			for(int i : list) {
				sum+=i;
			}
		}
		return sum/list.size();
	}

 

 

 

分享到:
评论

相关推荐

    个人整理编写的数学建模代码,开源分享.zip

    在数学建模中,算法参数的调整对于获得高质量的解是非常关键的。通过参考这些代码,参赛者可以学会如何根据具体问题选择合适的参数,甚至进行算法的创新和改进。 尽管我们没有具体的文件列表信息,仅有一个名为"new...

    java代码整理

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。"java代码整理"可能指的是对已经编写完成的Java程序进行优化、重构或分类管理的过程。这个过程对于保持代码的整洁性、提高代码...

    整理Cortex-M3技术资料

    4. **学习编程技巧**:通过阅读手册,开发者可以学习到最佳实践和优化技巧,提升代码质量。 在实际开发中,开发者需要结合Cortex-M3的技术文档、STM32的数据手册以及开发工具,才能更好地理解和利用这些资源,进行...

    高质量程序设计指南:C、C++语言(第3版)

    它不仅涵盖了基础语法、高级特性,还深入探讨了如何编写高质量代码的方法与技巧。本书旨在帮助读者掌握优秀的编程实践,并能够在实际项目中应用这些知识,提升软件质量和开发效率。 #### 二、核心知识点概览 #####...

    代码阅读整理5

    【代码阅读整理5】 在软件开发过程中,代码阅读是一项至关重要的技能,它涉及到对他人编写的源代码的理解、分析和评估。"代码阅读整理5"可能是某个系列教程或笔记的一部分,旨在帮助开发者提升代码理解能力,提高...

    高质量C编程高手整理版

    ### 高质量C编程高手整理版 #### 一、概览 本文档是关于高质量C编程的指南,由林锐博士编写,版本为1.0,发布于2001年7月24日。该文档旨在帮助学习C语言的学生和开发者掌握良好的编程习惯和实践方法,提升代码质量...

    codeMirror代码格式化(官方demo)

    总的来说,CodeMirror是一个强大且灵活的在线代码编辑器,无论是对于个人项目还是企业级应用,都能提供高质量的代码编辑体验。通过深入理解和利用其提供的功能,开发者可以创建出更加高效、易用的Web应用代码编辑...

    代码整理工具astyle(Windows新版本)

    AStyle(Artistic Style)是一款优秀的开源代码整理工具,主要用于自动格式化C、C++、C++/CLI、Objective-C、C#和Java等编程语言的源代码,使其遵循特定的编码风格。这款工具在编程社区中广受欢迎,因为它可以帮助...

    高质量C编程指南

    - **编程风格**:文档中可能提及了代码风格的问题,比如变量命名、代码组织和注释习惯,这些都是编写高质量代码的重要方面。 - **编程原则**:可能讨论了代码的可读性、可维护性和性能优化。 ### 10. 跨平台编程 -...

    C++高质量编程.txt

    - **解释**:高质量的C++程序应当具备良好的可读性和清晰度,使其他开发者能够容易理解代码的意图和逻辑。 - **实践建议**:使用有意义的变量名、函数名;合理地使用注释来解释复杂的逻辑或算法。 **1.2 4YeNv~g...

    教材代码-6.5辅助优化设计书上所有代码第五章

    在IT领域,优化设计是软件开发过程中的一个重要环节,它涉及到如何提高程序的效率、减少资源消耗以及提升用户体验。...通过学习这些知识,开发者能够编写出更高效、更可靠的软件,提升整个项目的质量和性能。

    JAVA代码编写的30条建议.doc

    在编写高质量的JAVA代码时,遵循一定的编程建议可以极大地提高代码的可读性、可维护性和性能。以下根据标题和描述中的内容,整理出30条JAVA编程的实用建议: 1. **命名规范**:使用有意义的驼峰命名法,如`...

    每天写出好代码的5个建议

    在软件开发领域,编写高质量的代码是每个程序员追求的目标。良好的代码不仅能够提高程序的稳定性和可维护性,还能够提升团队的协作效率。以下是从给定文件中提炼出的五个关于如何每天写出好代码的建议。 #### 1. ...

    系统代码复审和单元测试报告

    - 降低维护成本:高质量的代码和完善的测试能减少未来维护和扩展时的困难。 - 保障安全:通过审查和测试,发现并预防安全风险,保护用户数据安全。 4. 测试文档的重要性 - 形式化记录:编写单元测试报告可以整理...

    我整理的java代码库,使用eclipse工程方式展现

    11. **单元测试**:为了保证代码质量,代码库可能包含JUnit或TestNG等单元测试框架的示例,用于编写和执行测试用例。 12. **Java库与框架**:可能包含使用Apache Commons、Google Guava等常用库,以及Spring、...

    新手入门写Java程序的三十个基本规则

    - 使用Javadoc等工具编写高质量的文档注释。 - 注释应清晰地解释代码的目的和功能。 ### 12. 变量的命名与使用 - 选择有意义的变量名,提高代码可读性。 - 减少全局变量的使用,避免副作用。 ### 13. 异常处理 - ...

    性能安全测试面试题100%这样问

    - **开发人员**:关注代码质量和性能优化。 - **测试人员**:关注测试计划的制定和执行。 - **运维人员**:关注系统的稳定性和资源利用率。 #### 11. TPS问题排查 - **低TPS常见原因**: - **资源不足**:CPU、...

Global site tag (gtag.js) - Google Analytics