Tag: 性能

如何在java中的并行程序中获得理想的线程数?

我需要在批处理程序中获得理想数量的线程,该程序在支持并行模式的批处理框架中运行,如Spring Batch中的并行步骤。 据我所知,执行程序步骤的线程太多并不好,可能会对程序的性能产生负面影响。 一些因素可能导致性能下降(上下文切换,使用共享资源时的竞争条件(锁定,同步……)……(还有其他因素吗?))。 当然,获得理想线程数的最佳方法是让我有实际的程序测试来调整程序的线程数。 但在我的情况下,实际测试并不容易,因为测试需要很多东西(人员,测试计划,测试数据等),这对我来说现在很难准备。 所以,在进行实际测试之前,我想知道如何尽可能地获得我的程序中可猜测的理想线程数。 我应该考虑什么来获得我的程序的理想线程数(步数)? CPU核心数? 我的程序运行的机器上的进程数? 数据库连接数? 在这样的情况下,是否存在诸如公式之类的理性方式?

JBoss Cache和Ehcache的性能

我正在考虑使用JBoss Cache或Ehcache来实现缓存。 在查看了这两个API后,我直觉认为JBoss可能比Ehcache更高效,因为它可以将原始对象放入缓存,而Ehcache需要将数据包装在Element对象中。 我设置了一个快速的工作台,在缓存中重复插入密钥,值元组。 键和值类非常简单: 键: public class Key implements Serializable { private static final long serialVersionUID = -2124973847139523943L; private final int key; public Key(int pValue) { this.key = pValue; } public int getValue() { return this.key; } @Override public String toString() { return “Key [key=” + this.key + “]”; } } 值: public class […]

是否存在缓冲的ObjectInputStream?

我从一个350KB大小的文件反序列化一个对象,并花了相当长的时间。 我的计算机科学TA告诉我,有一种方法可以使用Buffered阅读器和ObjectInputStream来大大提高性能。 但是我在谷歌上找不到任何相关信息。

使用HSSF的Apache POI比XSSF快得多 – 下一步是什么?

我在使用Apache POI解析.xlsx文件时遇到了一些问题 – 我收到了java.lang.OutOfMemoryError: Java heap space我部署的应用程序中的java.lang.OutOfMemoryError: Java heap space 。 我只处理5MB以下和大约70,000行的文件,所以我怀疑阅读其他问题是有些不对劲。 正如本评论中所建议的,我决定使用建议的变量运行SSPerformanceTest.java ,以查看我的代码或设置是否有任何问题。 结果显示HSSF( .xls )和XSSF( .xlsx )之间存在显着差异: 1) HSSF 50000 50 1:经过1秒 2) SXSSF 50000 50 1:经过5秒 3) XSSF 50000 50 1:经过15秒 FAQ特别说: 如果你不能在3秒内完成所有HSSF,XSSF和SXSSF中50,000行和50列的运行(理想情况下要少得多!),问题在于您的环境。 接下来,它说要运行我已经完成的XLS2CSV.java 。 在上面生成的XSSF文件(包含50000行和50列)中输入大约需要15秒 – 与写入文件所用的数量相同。 环境有问题,如果有,我该如何进一步调查? VisualVM的统计数据显示在处理过程中使用的堆高达1.2Gb。 当然,考虑到与处理开始之前相比,这是一个额外的演出,这是太高了吗? 注意:上面提到的堆空间exception只发生在生产中(在Google App Engine上)并且仅发生在.xlsx文件中,但是这个问题中提到的测试都已经在我的开发机器上运行了-Xmx2g 。 我希望如果我可以解决我的开发设置问题,它将在部署时使用更少的内存。 来自app引擎的堆栈跟踪: 引起:java.lang.OutOfMemoryError:org.apache.xmlbeans.impl.store.Cur上的org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260)中的Java堆空间$ CurLoadContext.startElement( Cur.java:2997)org.apache.xmlbeans.impl.store.Locale $ SaxHandler.startElement(Locale.java:3211)at […]

Java:System.out.println()背后的原因是什么?

对于可以在文本编辑器中完成的小型逻辑程序,为了跟踪我使用经典的System.out.println() 。 我猜你们都知道在大量迭代的块中使用它是多么令人沮丧。 为什么这么慢? 它背后的原因是什么?

通过-Xmx分配更多内存时,Sun JVM是否会变慢?

当更多内存可用并通过-Xmx使用时,Sun JVM是否会变慢? (假设:机器有足够的物理内存,因此虚拟内存交换不是问题。) 我问,因为我的生产服务器要接收内存升级。 我想把-Xmx值提升到颓废的东西。 我的想法是防止由于我自己的编程错误而不时出现任何堆空间耗尽故障。 罕见的事件,但如果我有一个淫秽-Xmx值,如2048mb或更高,我可以通过快速发展的webapp避免它们。 应用程序受到严密监控,因此会注意到JVM内存消耗的exception峰值并修复任何缺陷。 可能的重要细节: Java 6(以64位模式运行) 4核Xeon RHEL4 64位 spring,Hibernate 高磁盘和网络IO 编辑 :我试图避免发布我的JVM的配置,但显然这使得问题可笑地开放结束。 所以,这里我们使用相关的配置参数: -Xms256m -Xmx1024m -XX:+UseConcMarkSweepGC -XX:+AlwaysActAsServerClassMachine -XX:MaxGCPauseMillis=1000 -XX:MaxGCMinorPauseMillis=1000 -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError

使用enum.values()与String数组时是否有性能损失?

我正在使用枚举来替换我的Java应用程序中的String常量(JRE 1.5)。 当我将enum视为不断调用的方法中的静态名称数组(例如,在呈现UI时)时,是否会有性能损失? 我的代码看起来有点像这样: public String getValue(int col) { return ColumnValues.values()[col].toString(); } 澄清: 我关心的是与重复枚举values()相关的隐藏成本(例如在paint()方法中)。 我现在可以看到我的所有场景都包含一些int => enum转换 – 这不是Java的方式。 提取values()数组的实际价格是多少? 这甚至是个问题吗? Android开发者 请阅读下面的Simon Langhoff的答案,Geeks On Hugs在接受的答案评论中已经指出了这一点。 Enum.values() 必须做一个防御性的副本

GetPropertyAction与System.getProperty获取系统变量

我一直在使用相当多的东西 System.getProperty(“property”) 为了获得环境信息。 但是,在我看来,Sun更喜欢以下内容: (String) java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction(“property”)); 奇怪的是,这段代码涉及一个演员,结果应该比一点慢 System.getProperty 实现,只使用安全管理器然后立即从实例变量props获取属性。 我的问题是为什么Sun选择使用第二种方法在内部获取代码中的大多数环境变量 System.getProperty 似乎更快的方式去?

切换似乎比如果慢

我很好奇切switch速度,认为它“非常”快,但我有一个测试用例似乎显示单个开关大约快4, if测试,当我预期(没有坚实的理由)它与1次测试一样快。 这是我用来比较switch的两种方法if : public static int useSwitch(int i) { switch (i) { case 1: return 2; case 2: return 3; case 3: return 4; case 4: return 5; case 5: return 6; case 6: return 7; default: return 0; } } public static int useIf(int i) { if (i == 1) return 2; if […]

Object.isArray()很慢,有没有快速的方法呢?

在我的应用程序中, obj.getClass().isArray()被频繁调用并成为应用程序的瓶颈。 如果对象是数组,我想在运行时有效地检查。 原始数组和对象数组应返回true。 我可以想象的方法是instanceof所有原始数组,但不能处理像int [] []这样的类型。 该应用程序用作lib,因此我无法列出所有类型。 那有什么线索吗?