Tag: 性能

性能:Java的String.format

可能重复: 如果性能很重要,我应该使用Java的String.format()吗? 我想知道在Java应用程序中使用String.format而不是StringBuilder …所以,我只是编写一个简单的测试,如下所示: public static void main(String[] args) { int i = 0; Long start = System.currentTimeMillis(); while (i < 10000) { String s = String.format("test %d", i); i++; } System.out.println(System.currentTimeMillis() – start); i = 0; start = System.currentTimeMillis(); while (i < 10000) { String s = new StringBuilder().append("test ").append(i).toString(); i++; } System.out.println(System.currentTimeMillis() – […]

增加核心数时降低性能

我的mac配备了16个核心。 System.out.println(Runtime.getRuntime().availableProcessors()); //16 我正在运行下面的代码,以了解使用我的核心的有效性。 线程’CountFileLineThread’只计算文件中的行数(文件夹中有133个文件) 我在这条线上做笔记: ExecutorService es = Executors.newFixedThreadPool(NUM_CORES); NUM_CORES在1到16之间。 您将从下面的结果中注意到,5个以上内核的性能开始下降。 我不希望6芯及以上的产品“收益递减”(btw,7芯需要超过22分钟,你好?!?!)我的问题是为什么? public class TestCores { public static void main(String args[]) throws Exception { long start = System.currentTimeMillis(); System.out.println(“START”); int NUM_CORES = 1; List files = Util.getFiles(“/Users/adhg/Desktop/DEST/”); System.out.println(“total files: “+files.size()); ExecutorService es = Executors.newFixedThreadPool(NUM_CORES); List<Future> futures = new ArrayList<Future>(); for (File file : files) […]

优化Java对象以提高CPU缓存行的效率

我正在写一个库,其中: 它需要在各种不同的平台 / Java实现上运行(常见的情况可能是使用Windows或Linux的Intel 64位计算机上的OpenJDK或Oracle Java) 实现高性能是一个优先事项 ,因为我关心对象访问中的CPU缓存行效率 在某些区域,将遍历/处理相当大的小对象图形 (假设大约1GB) 主要工作量几乎完全是读取 读取将分散在对象图中,但不是完全随机的(即,将存在重要的热点,偶尔读取到不常访问的区域) 多个线程将同时访问 (但不修改)对象图。 没有锁定,假设不会发生并发修改。 设计小对象是否有一些经验法则/指南,以便在这种环境中有效利用CPU缓存线? 我对正确调整和构造对象特别感兴趣,因此例如最常访问的字段适合第一个缓存行等。 注意:我完全清楚这是依赖于实现的,我需要进行基准测试,以及过早优化的一般风险。 无需浪费任何进一步的带宽指出这一点。 🙂

Java中的XML解析器是否比Xalan / Xerces更快

我没有找到很多方法来提高执行密集XML处理的Java应用程序的性能,而不是利用Tarari或Datapower等硬件。 有谁知道任何加速XML解析的开源方法?

为什么我不会在每个延迟加载的关系中使用@BatchSize?

hibernate的@BatchSize注释允许批量提取延迟加载的实体。 例如,如果我得到类似的东西: public class Product { @OneToMany(fetchType=LAZY) @BatchSize(size=10) private ProductCategory category; } 现在,如果我得到产品的类别,Hibernate将获取最多十个产品的类别,这些产品在当前会话中并且尚未初始化其类别字段。 这节省了大量SQL调用数据库。 到现在为止还挺好。 现在我想知道为什么我不会在每个懒惰的加载关系上使用@BatchSize注释? 毕竟为什么我要额外调用数据库? 显然必须有这个原因,否则Hibernate的人可能会把它作为默认,但我目前看不到它。

MethodHandle性能

我写了一个小基准测试来测试java.lang.invoke.MethodHandle , java.lang.reflect.Method和方法的直接调用的性能。 我读到MethodHandle.invoke()性能几乎与直接调用相同。 但我的测试结果显示另一个: MethodHandle调用比reflection慢大约三倍。 我的问题是什么? 可能这是一些JIT优化的结果? public class Main { public static final int COUNT = 100000000; static TestInstance test = new TestInstance(); static void testInvokeDynamic() throws NoSuchMethodException, IllegalAccessException { int [] ar = new int[COUNT]; MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType mt = MethodType.methodType(int.class); MethodHandle handle = lookup.findStatic(TestInstance.class, “publicStaticMethod”, mt) ; try { […]

newInstance()vs new

调用newInstance()是否会受到惩罚,或者下面的机制是否相同? newInstance()对新关键字*有多少开销? *:折扣newInstance()暗示使用reflection的事实。

局部变量或类字段?

我今天读了一篇关于 C#和Java 性能改进的文章 。 我仍然坚持这个: 19.不要过度使用实例变量 使用局部变量可以提高性能。 示例1中的代码执行速度比示例2中的代码快。 例1: public void loop() { int j = 0; for ( int i = 0; i<250000;i++){ j = j + 1; } } 例2: int i; public void loop() { int j = 0; for (i = 0; i<250000;i++){ j = j + 1; } } 实际上,我不明白为什么在我可以对字段进行简单访问时,每次调用loop函数时实例化一些内存并释放它应该更快。 […]

用于内存减少的Java整数标志和按位运算

使用整数标志和按位运算是减少高容量对象的内存占用的有效方法吗? 记忆足迹 我的理解是,通常将boolean存储为JVM实现中的int 。 它是否正确? 在这种情况下,32个标志肯定代表了大量的内存占用减少。 虽然JVM实现当然有所不同,但情况可能并非总是如此。 性能 我的理解是,CPU是非常数字驱动的,并且按位操作与计算中的内容一样高效。 在布尔运算中使用按位运算会有性能损失 – 甚至增益吗? 备择方案 有没有更好的方法来完成同样的事情? Enum是否允许组合标志,即FLAGX = FLAG1 | FLAG2 FLAGX = FLAG1 | FLAG2 ? 示例代码 注意最后一个方法propogateMove()是递归的,可能每秒被调用数百次,并且直接影响我们应用程序的响应性,因此使用标志来避免逻辑位并调用其他方法。 // FLAGS helper functions private final void setclear(int mask, boolean set) { if (set) set(mask); else clear(mask); } private final void set(int mask) { flags |= mask; } […]

如何使用Java将> 1000 xml文件合并为一个

我试图将许多xml文件合并为一个。 我已经在DOM中成功完成了这项工作,但此解决方案仅限于几个文件。 当我在多个文件> 1000上运行它时,我得到一个java.lang.OutOfMemoryError。 我想要实现的是我有以下文件 档案1: …. 文件2: …… 档案n: …. 结果:输出: …. …. …. 这是我目前的实施: DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); Element rootSetElement = doc.createElement(“rootSet”); Node rootSetNode = doc.appendChild(rootSetElement); Element creationElement = doc.createElement(“creationDate”); rootSetNode.appendChild(creationElement); creationElement.setTextContent(dateString); File dir = new File(“/tmp/rootFiles”); String[] files = dir.list(); if (files == null) […]