- 浏览: 211423 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yangdefeng95802:
也不换个行,这个谁爱看,估计你自己都不爱看!
CXF2.0.8+Spring+Hibernate -
l1i2n3y4u5n6:
你没有解惑,让我很迷惑
Apache2.2和tomcat集成更加简单了 -
micropang:
LJ
CXF2.0.8+Spring+Hibernate -
mayufenga1:
更本没说明白
Apache2.2和tomcat集成更加简单了 -
highriver:
什么公司,这样的人性。
Learning Day
对于任何语言来讲,循环永远是非分布式系统的性能的最大杀手,循环中的任何一个简单的语句对性能都是有影响的,只是影响的大小不同而已。第一个例子中的影响是比较大的,不同的实现方法的时间开销不同,然后这个微小的差异被循环次数放大后就非常的明显(3倍),而第二个例子,其本质是减少了循环执行的次数,虽然总的循环次数是一样的,但是最耗时的操作的执行次数被减少到1/10,所以产生的差异是非常巨大的(8倍)。我们再来看一个很不起眼的微小差异带来的影响:
public class GoogleFn {
private static int MAX = 132000000;
private static int MAX2 = MAX / 10;
private static int count(int n) {
int count = 0;
while (n > 0) {
int mod = n % 10;
if (mod == 1)
count++;
n = n / 10;
}
return count;
}
private static void method2() {
long start = System.currentTimeMillis();
int result = 0;
for (int i = 0; i < MAX2; i++) {
int number = i * 10;
int value = count(number);
for (int j = 0; j < 10; j++) {
result += value;
if (j == 1) {
result++;
}
int x = number + j;
if (result == x && x != 0) {
print(x, start);
}
}
}
}
private static void print(int i, long start) {
System.out.println("Find " + i + ", " + (System.currentTimeMillis() - start) + "ms");
}
public static void main(String[] args) {
method1();
method2();
}
}
运行结果:
Find 1, 0ms
Find 199981, 16ms
Find 199982, 16ms
Find 199983, 16ms
Find 199984, 16ms
Find 199985, 16ms
Find 199986, 16ms
Find 199987, 16ms
Find 199988, 16ms
Find 199989, 16ms
Find 199990, 16ms
Find 200000, 16ms
Find 200001, 16ms
Find 1599981, 63ms
Find 1599982, 63ms
Find 1599983, 63ms
Find 1599984, 63ms
Find 1599985, 63ms
Find 1599986, 63ms
Find 1599987, 78ms
Find 1599988, 78ms
Find 1599989, 78ms
Find 1599990, 78ms
Find 2600000, 110ms
Find 2600001, 110ms
Find 13199998, 531ms
Find 35000000, 1453ms
Find 35000001, 1453ms
Find 35199981, 1453ms
Find 35199982, 1453ms
Find 35199983, 1453ms
Find 35199984, 1453ms
Find 35199985, 1453ms
Find 35199986, 1453ms
Find 35199987, 1453ms
Find 35199988, 1453ms
Find 35199989, 1453ms
Find 35199990, 1453ms
Find 35200000, 1453ms
Find 35200001, 1453ms
Find 117463825, 5000ms
Find 1, 0ms
Find 199981, 16ms
Find 199982, 16ms
Find 199983, 16ms
Find 199984, 16ms
Find 199985, 16ms
Find 199986, 16ms
Find 199987, 16ms
Find 199988, 16ms
Find 199989, 16ms
Find 199990, 16ms
Find 200000, 16ms
Find 200001, 16ms
Find 1599981, 63ms
Find 1599982, 63ms
Find 1599983, 63ms
Find 1599984, 63ms
Find 1599985, 63ms
Find 1599986, 63ms
Find 1599987, 78ms
Find 1599988, 78ms
Find 1599989, 78ms
Find 1599990, 78ms
Find 2600000, 109ms
Find 2600001, 109ms
Find 13199998, 516ms
Find 35000000, 1438ms
Find 35000001, 1438ms
Find 35199981, 1438ms
Find 35199982, 1438ms
Find 35199983, 1438ms
Find 35199984, 1438ms
Find 35199985, 1438ms
Find 35199986, 1438ms
Find 35199987, 1438ms
Find 35199988, 1438ms
Find 35199989, 1438ms
Find 35199990, 1438ms
Find 35200000, 1438ms
Find 35200001, 1438ms
Find 117463825, 4938ms
注意我们的MAX值比以前的例子放大了10倍,因为这个例子的差异比较小,值太小看不出差异,注意到两个方法的不同了吗?对,仅仅是if里面的条件换了个位置:
x != 0 && result == x -》 result == x && x != 0
你还可以稍稍修改下代码,把后面的那个的&& x != 0去掉,你会发现它的结果和这个结果很类似。
这个原理就是&&运算符的短路原理,如果前面的条件不为true,那么后面的计算不被执行。
所以循环中的任何代码都要比较小心,即使一点细小的不同都会在循环的放大作用下产生一些不好的结果。
PS: 条件判断中有多个并列条件时,前面放的应该是最少满足的条件,这样可以更好的过滤。
评论
架构固然重要,但代码质量也同样重要。楼主所列举的这些性能的问题其实所有人都知道,但很多人都没有注意和下功夫,最终整个产品质量不高。我见过很多这样的例子,刚写出来的一个不大的程序执行要花大量时间,用jprofile监控加调试,一个语句一个语句的优化。最终性能很棒。试想,如果平时就养成习惯多注意这些“细小”的性能问题,那么在动手做个大的系统时就不怕了。
String 的"+"和StringBuffer的"append"也就多耗个100ms而已,而且还要看是多大的字符串.
发表评论
-
Tomcat集群概要
2007-09-05 03:59 1988其实已经有很多文档了,不过还是老话,给自己备忘,总结些要注意的 ... -
Eclipse的一个问题
2007-09-05 06:13 1304最近遇到的,偶然间解决的,如果一些文件和目录已经被Worksp ... -
Java远程调试
2007-09-05 06:47 2302其实就是使用了JDK的JPDA,在启动服务器(Jboss或者T ... -
JDK5中没被重视的重要特性:instrumentation
2007-09-05 07:42 1646我们的产品中使用到这个特性了,主要是加载Jboss的AOP,另 ... -
得到当前方法
2007-08-09 13:53 1326在写代码的时候我们可能会需要当前的方法名,特别是在输出一些调试 ... -
使用AOP带来的问题
2007-08-02 04:57 1370AOP绝对是个好东西,但是因为大部分的AOP实现都是通过修改字 ... -
推荐一个Eclipse插件:Implementors
2007-08-01 05:06 1107也许有点老土了,但是这个插件确实是刚刚别人推荐给我的,而且很好 ... -
使用JBossCache作为Hibernate的二级缓存
2007-07-23 11:36 2087这个是最近的工作成果,使用JBossCache作为Hibern ... -
URLDataSource请求资源三次的问题
2007-07-13 04:58 1454这个是进公司的第二个任务,由于是多个应用服务器集群,而产生pd ... -
JSP的一个小误区
2007-07-12 11:15 968相信很多人在面试的时候都会被问到JSP和Servlet的区别, ... -
Hot Deploy成功
2007-07-12 11:24 1331前几天曾经抱怨新公司的开发环境太复杂,不能Hot Deploy ... -
文件删除不成功
2007-07-12 11:31 1067Java的功能在某些地方确实很有缺陷,File的delete方 ... -
AR何其多
2007-07-09 13:29 1171看了新公司的发布目录,感叹公司把Java相关的发布包用得出神入 ... -
太复杂了!!!
2007-07-03 12:58 1097今天总算是把工程在Eclipse下配置好了,而且没有任何错误, ... -
links for 2007-05-12
2007-05-12 14:21 1077Lucene Hack之通过缩小搜索结果集来提升性能 (1 ... -
Java序列化确实很慢啊
2007-04-25 06:37 2048我们的系统还使用古老的Ant1.5作为构建工具,而且做了一些定 ... -
使用工具修改代码时一定要谨慎
2007-04-19 03:21 1152今天早上来更新了下代码,发现自己负责的和Crystal Rep ... -
数据库可移植性重要吗?
2007-04-18 06:30 2099对于大部分应用而言,数据库可移植性可能不太重要,而一些完全使用 ... -
没落的Java社区
2007-04-17 09:27 1507感觉原来的几个Java社区日益没落,当然这个和Java世界的消 ... -
也谈Java基础的重要性
2007-04-10 07:33 2807呵呵,看到JDon上正在讨论j2se基础的重要性,忍不住也来说 ...
相关推荐
前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; ...
JMeter是一款强大的性能测试工具,常用于模拟大量用户并发访问Web应用程序,以评估系统的性能和稳定性。以下将详细介绍JMeter的使用、线程组配置及性能测试的关键点。 **JMeter录制与过滤** JMeter可以通过BadBoy等...
性能测试工程师面试题是指性能测试工程师在面试过程中遇到的常见问题,涵盖了性能测试的基础知识、LoadRunner 的使用、场景设置、脚本录制、参数设置、关联机制、调试技巧等多个方面。 1. 负载测试和性能测试的区别...
在 IT 行业中,面试是企业选拔人才的重要步骤之一,而 Google 作为全球顶尖的科技公司,其面试方式也备受关注。Google 面试题集锦就是一个集合了 Google 面试题的资源,涵盖了逻辑、数学、算法等多个方面的知识点。 ...
性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖...
本资源旨在总结和详细解释SQL面试题中的各种问题和解决方案,并对每个问题进行了详细的解释和分析。 一、查询每门课都大于80分的学生姓名 问题:使用一条SQL语句查询出每门课都大于80分的学生姓名。 解决方案:...
Java中的IO与NIO面试题 Java反射面试题 Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 Spring Boot面试题 Spring Cloud面试题...
以后会慢慢把Java相关的面试题、计算机网络等都加进来,其实这不仅仅是一份面试题,更是一份面试参考,让你熟悉面试题各种提问情况,当然,项目部分,就只能看自己了,毕竟每个人简历、实习、项目等都不一样。面试题...
- **Netty** 是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。 2. **Java并发编程最全面试题 123道**: - **线程安全**:Java中的`synchronized`关键字、`volatile`...
本资源“经典sql语句”聚焦于SQL的经典面试题及其解答,旨在帮助求职者特别是针对SQL Server岗位的应聘者准备面试。以下将详细解析SQL的一些核心知识点,并结合可能的面试问题进行阐述。 1. **选择查询(SELECT)**...
文档“python面试题搜集(六):110道Python面试题(上).md”和“python面试题搜集(六):史上最全python面试题详解(三).md”可能包含更多实战性问题,涉及Python性能优化、并发编程、设计模式以及Python与其他...
在面试中,SQL语句的内联外联经典面试题是一个非常重要的考察点。本文将对SQL语句的内联外联进行详细的介绍和分析,并提供了一些经典的面试题和答案,以便读者更好地理解和掌握SQL语句的内联外联。 一、SQL语句的...
本文总结了C语言面试题大汇总之华为面试题,涵盖了局部变量、全局变量、extern关键字、for循环、while循环、静态变量、静态函数、内存分配等知识点。 一、局部变量和全局变量 局部变量可以与全局变量同名,在函数...
在面试中,掌握这些知识点可以帮助自己更好地应对面试官的问题,提高自己的面试成功率。 此外,这些知识点也可以作为学习和复习的 reference,帮助同学们更好地学习和掌握人工智能领域的知识。 这些知识点涵盖了...
在面试题中,我们可以看到数据分析的应用,例如找到每个国家第三高的山峰。数据分析是指对数据进行处理、转换、分析和解释,以便获取有价值的信息和结论。 * 数据分析步骤:问题定义、数据收集、数据清洁、数据分析...
Java 和 SQL 是 IT 行业中两个至关重要的技术领域,特别是在软件开发和数据库管理中。以下是对这些领域的基础面试题及答案的详细解读。 一、Java 面试题 1. **Java 的特点:** Java 以其跨平台性、安全性、高性能...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
6. **子查询**:子查询是在一个SQL语句中嵌套另一个SQL查询,用于获取满足特定条件的子集数据,可以作为其他查询的一部分。 7. **视图(VIEW)**:视图是虚拟表,基于一个或多个表的查询结果,提供了一种简化数据...
在Java面试中,掌握SQL语句是至关重要的,因为大多数应用程序都需要与数据库进行交互。SQL,全称为结构化查询语言,是用于管理关系数据库的标准语言。以下是对SQL语句的详细解析,主要涵盖DDL(数据定义语言)、DML...