Tag: 性能

Integer.parseInt(scanner.nextLine())vs scanner.nextInt()

我的教授倾向于做以下事情来从用户那里得到一个数字: Scanner scanner = new Scanner(System.in); Integer.parseInt(scanner.nextLine()); 与简单地执行scanner.nextInt()相比有什么好处? java.util.Scanner.java包含以下内容: public int nextInt() { return nextInt(defaultRadix); } public int nextInt(int radix) { // Check cached result if ((typeCache != null) && (typeCache instanceof Integer) && this.radix == radix) { int val = ((Integer)typeCache).intValue(); useTypeCache(); return val; } setRadix(radix); clearCaches(); // Search for next int try { […]

Java不是垃圾收集内存

我正在读取一个非常大的文件,并从每一行中提取一小部分文本。 但是在操作结束时,我的内存很少。 看起来垃圾收集器在读取文件后无法释放内存。 我的问题是:有没有办法释放这段记忆? 或者这是一个JVM错误? 我创建了一个SSCCE来certificate这一点。 它读取1 mb(由于16位编码而在Java中为2 mb)文件并从每行中提取一个字符(~4000行,因此应该是大约8 kb)。 在测试结束时,仍然使用了完整的2 mb! 初始内存使用情况: Allocated: 93847.55 kb Free: 93357.23 kb 读取文件后立即(在任何手动垃圾收集之前): Allocated: 93847.55 kb Free: 77613.45 kb (~16mb used) 这是预料之中的,因为程序正在使用大量资源来读取文件。 然而,我垃圾收集,但不是所有的内存都被释放: Allocated: 93847.55 kb Free: 91214.78 kb (~2 mb used! That’s the entire file!) 我知道手动调用垃圾收集器不会给你任何保证(在某些情况下它是懒惰的)。 然而,这发生在我的大型应用程序中,其中文件几乎占用了所有可用内存,并且导致程序的其余部分尽管需要它而耗尽内存。 这个例子证实了我怀疑从文件中读取的多余数据没有被释放。 以下是生成测试的SSCCE: import java.io.*; import java.util.*; public class Test { […]

Java应用程序的性能分析器

我需要优化Java应用程序。 它会进行一些第三方通话。 我需要一些好的工具来准确测量各个API调用所花费的时间。 为了解复杂性 – 应用程序采用包含100万行的数据源文件,完成处理大约需要一个小时。 作为处理的一部分,它会进行一些第三方呼叫(包括一些网络呼叫)。 我需要确定哪些调用比其他调用花费更多时间,并在此基础上找到优化应用程序的方法。 任何建议,将不胜感激。

Hibernate:动态更新动态插入 – 性能效果

使用动态更新或动态插入具有积极的作用,但通常仅略微提高性能,如http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/所述。 但是参考文档提到这可能会产生负面的性能影响,如http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class中所述 : 虽然这些设置可以在某些情况下提高性能,但实际上可能会降低其他设置的性能。 任何人都可以建议一些示例/场景提到相同的负面性能影响吗?

表每子类inheritance关系:如何在不加载任何子类的情况下查询Parent类??? (hibernate)

假设每个子类的表inheritance关系可以在下面描述(来自wikibooks.org – 见这里 ) 注意父类不是抽象的 @Entity @Inheritance(strategy=InheritanceType.JOINED) public class Project { @Id private long id; // Other properties } @Entity @Table(name=”LARGEPROJECT”) public class LargeProject extends Project { private BigDecimal budget; } @Entity @Table(name=”SMALLPROJECT”) public class SmallProject extends Project { } 我有一个场景 , 我只需要检索Parent类 。 由于性能问题,我该怎么做才能运行HQL查询以便检索Parent类而只是父类而不加载任何子类?

将大量小文件读入内存的最快方法是什么?

我需要在每个服务器启动时读取~50个文件,并将每个文本文件的表示放入内存中。 每个文本文件都有自己的字符串(这是用于字符串持有者的最佳类型?)。 将文件读入内存的最快方法是什么?保存文本的最佳数据结构/类型是什么,以便我可以在内存中操作它(主要是搜索和替换)? 谢谢

更快的方式来读取文件

我正在开发一个包含大约400个输入文件和大约40个输出文件的程序。 它很简单:它读取每个输入文件,并生成一个新文件但更大(基于算法)。 我正在使用BufferedReader中的read()方法: String encoding =”ISO-8859-1″; FileInputStream fis = new FileInputStream(nextFile); BufferedReader reader = new BufferedReader(new InputStreamReader(fis, encoding)); char[] buffer = new char[8192] ; 要读取我正在使用的输入文件: private String getNextBlock() throws IOException{ boolean isNewFile = false; int n = reader.read(buffer, 0, buffer.length); if(n == -1) { return null; } else { return new String(buffer,0,n); } } 对于每个块我正在进行一些检查(比如在块中查找一些字符串)然后我将其写入文件: […]

为什么64位JVM比32位JVM更快?

最近我一直在对我公司的数据库产品的写入性能进行一些基准测试,我发现只需切换到64位JVM就可以实现20-30%的一致性能提升。 我不允许详细介绍我们的产品,但基本上它是一个面向列的数据库,针对存储日志进行了优化。 该基准测试涉及为其提供几千兆字节的原始日志,并计算分析它们并将其作为结构化数据存储在数据库中所需的时间。 CPU和I / O的处理非常繁重,但很难说它的比例是多少。 关于设置的一些注意事项: Processor: Xeon E5640 2.66GHz (4 core) x 2 RAM: 24GB Disk: 7200rpm, no RAID OS: RHEL 6 64bit Filesystem: Ext4 JVMs: 1.6.0_21 (32bit), 1.6.0_23 (64bit) Max heap size (-Xmx): 512 MB (for both 32bit and 64bit JVMs) 两个JVM的常量: 相同的操作系统(64位RHEL) 相同的硬件(64位CPU) 最大堆大小固定为512 MB(因此速度增加不是由于64位JVM使用更大的堆) 为简单起见,我已经关闭了产品中的所有multithreading选项,因此几乎所有处理都以单线程方式进行。 (当我打开multithreading时,当然系统变得更快,但32位和64位性能之间的比率保持不变。) 所以,我的问题是……为什么我在使用64位JVM时会看到20-30%的速度提升? 以前有人见过类似的结果吗? 直到现在我的直觉如下: 64位指针更大,因此L1和L2缓存更容易溢出,因此64位JVM上的性能更差。 […]

Java图形 – 游戏的阶段

这是一个最近困扰我的话题。 在JFrame中创建游戏时,如果要使用paintComponent()方法将图形添加到JPanel中,您将如何为游戏提供不同的阶段? 哪种性能最佳? 我能想到的两种方式是: 添加和删​​除包含自己的paintComponent()方法和计时器的面板。 一个不同的面板将用于游戏的每个阶段(等级等)。 将所有内容保存在一个面板或框架中,并具有许多布尔值和if语句。 例如,如果游戏结束时将布尔值更改为true,并且在paintComponent() – 方法中,则使用if语句说明if(gameover)然后为此阶段的游戏绘制图形。 或者还有其他更好的方法吗?

测量代码段的Java执行时间,内存使用和CPU负载

对于特定的Java代码段,我想测量: 执行时间(很可能是线程执行时间 ) 内存使用情况 CPU负载(特别是可归因于代码段) 我是相对Java的新手,并不熟悉如何实现这一点。 我已经被提到了JMX ,但是我不确定如何使用JMX,JMX看起来有点“重”我正在做什么。 理想情况下,我想要一些可以告诉我想测量的测量类,可以选择在代码段之前调用start()方法,然后调用stop()方法。 相关指标将记录到我指定的文件中。 例如: import com.example.metricLogger; metricLogger logger = new metricLogger(); logger.setLogPath(pathToLogFile); logger.monitor(executionTime); logger.monitor(memoryUsage); logger.monitor(cpuLoad); logger.start(); /* Code to be measured */ logger.stop(); 在Java中是否有任何标准/通用/传统方式来实现这一目标? 这些测量用于一次性性能比较,因此我不会寻找任何生产中的长期监测过程。 我很高兴被引用到教程或外部示例,并且不希望在这里得到完整答案。 也就是说,如果能够实现上述任何简单的事情,那么一个现实的例子就会非常顺利。