InfoQ

新闻

Java基准所面临的挑战

作者 Steven Haines译者 张龙 发布于 2008年8月11日 下午5时25分

社区
Java
主题
性能和可伸缩性
Brent Boyer是Elliptic Group的一名程序员,他在IBM开发者网站上发表了一篇名为“健壮的Java基准(Robust Java Benchmarking)”的文章。这篇文章包含两个部分,主要探究了如何实现有效的Java基准。首先,他论述了当前编译器下不同JVM有着不同的特性和优化,而这些特性或是优化有可能会对性能测试产生负面影响。举例来说,假如有一段复杂的代码段,最后计算得到的是一个从未使用的值,那么强势编译器就会对这段代码进行优化,基准则会忽略这段计算。为了说明这一点,他在他哦个一台计算机上连续运行了很多次相同的代码段,结果运行时都是4.9秒,但当他删除了打印结果的println 语句之后,运行时间则缩短到0.08秒。他还指出,时间度量的粒度在不同的操作系统下是不一样的,因此在基准测试的时候,一定要弄清楚当前系统的时间度量粒度。他说,和System.nanoTime()相比,System.currentTimeMillis()就不是一个度量运行时间的好方法(),因为它在Windows XP上只有15ms的精度(但在具有2.6内核的Linux上却可以达到1ms的精度)。

在阐述了这些特别的行为之后,Boyer提到了一些在做典型的基准测试时容易忽略的一些问题,比如JVM缓存、资源回收(如垃圾收集、对象清理)。他认为避免这些问题的唯一有效方式是“预热(warm up)”代码直到代码达到一个稳定态。“预热”过程很耗时间并且很具挑战,因为有些JVM在其触发编译之前可能已经将一个函数执行了10,000次(但在编译触发前,代码还处于解析状态)。代码达到稳定状态之后,基准必须对这段代码运行多次,然后才能对结果做出有效的统计分析。

此外,Boyer还建议采用基准框架来做基准测试,他本人就编写了这样一个框架。该框架能够展示以不同数目的元素来访问数据结构(原生数组、 ArrayLists、Vectors、HashMap、TreeMap等等)中的数据的差异。Boyer向大家展示了两个有趣的分析结果:(1)即使运行时短暂到以纳秒计数,其基准框架仍能计算出平均访问时间。(2)不同负载下,某些数据结构的反应令人非常吃惊。其中一个特别的例子是 ConcurrentHashMaps与TreeMap的比较:在同样拥有1024个元素时,CurrentHashMaps的表现要远远好于 TreeMap,但当元素数量上升到1024x1024的时候,两者表现就相差不大。这很出乎意料,因为hash map的搜索时间是常量,但trees的搜索时间却是log(n)。除却这些令人吃惊的奇怪的结果,这篇文章还是非常值得一读的,尤其是在对Java代码进行基准评测时,Boyer提出的建议还是值得参考的。

查看英文原文:The Challenges in Java Benchmarking

1 条回复

回复

XP下精度也太差了. 发表人 少远 姚 发表于 2008年8月12日 上午2时26分
  1. 返回顶部

    XP下精度也太差了.

    2008年8月12日 上午2时26分 发表人 少远 姚

    System.currentTimeMillis()竟然在xp上面有这么严重的误差

深度内容

Flex与JSON及XML的互操作

平台需要互操作性。在这篇文章中,作者仔细研究了Flex和JSON及XML的互操作性。文章也包含了使用E4X库来将XML映射到图表和表格组件的内容,还演示了如何使用as3core库来解码JSON消息。

用Qi4j进行面向组合编程

本文将简要介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重新点燃使用可重用部件组装领域模型(Domain Model)的希望。

系统开发——新学科,新教育

一门新的计算机学科——“系统开发”,强调人性化、匠艺、设计、创意、创新和新事物的涌现,并建议用被称为“bottega”的工作室替代乏善可陈的教室。

图书聚焦:Visual Studio 2008 揭秘

Mike Snell和Lars Powers用他们最近由Sams出版的新书《Visual Studio 2008揭秘》,试图帮助大家提高开发人员的生产力。本文包括一个下载样章——第10章调试。

BPEL为何不是BPM的圣杯?

Pierre Vigneras在本文中讨论了作为标准之一的BPEL所存在的问题。Pierre先给我们大致介绍了一个简单的并行流程,接着讨论了从业者在试图以一个结构化模型为基础表达非结构化流程时遇到的一系列问题。

基于范型的多语言编程

你是否仔细思考过,为什么人们总在讨论“要正确的语言做恰当的事情”?在这篇文章中,Sadek Drobi向你解释了为什么应该在系统内部混合使用多种语言。

采访与书摘《Pro Web 2.0 Application Development with GWT》

Jeff Dwyer就关于他的新书(《Pro Web 2.0 Application Development with GWT》)、GWT1.5以及创建可搜索的Ajax应用谈了一些他的见解。

时刻准备着,迎接IT业的春天

我们需要设身处地地为客户及客户的业务本身着想,与客户同舟共济。更多创新的思路、产品和模式也同样将为IT业带来新的出路。IT业并不需要坐以待毙,在春天到来之后,市场将会更加繁荣!