Tag: performance

如何从Java中的BufferedReader对象中提取整个内容的最佳方法是什么?

我试图通过URLConnection获取整个WebPage。 最有效的方法是什么? 我已经这样做了: URL url = new URL(“http://www.google.com/”); URLConnection connection; connection = url.openConnection(); InputStream in = connection.getInputStream(); BufferedReader bf = new BufferedReader(new InputStreamReader(in)); StringBuffer html = new StringBuffer(); String line = bf.readLine(); while(line!=null){ html.append(line); line = bf.readLine(); } bf.close(); html包含整个HTML页面。

是否有类似于mini-mvc-profiler for Java的东西?

像标题所说: 是否有类似于Java的mini-mvc-profiler ? 我正在寻找可以在Struts或Spring MVC应用程序中使用的东西,并在DEV环境中的每个页面上显示快速的性能概述。

在Java中复制数据的更快方法?

我被赋予了从服务器复制数据的任务。 我正在使用BufferedInputStream和输出流来复制数据,我正在逐字节地进行。 即使它正在运行但复制数据需要花费很长时间,因为其中一些数据是100的MB,所以肯定它不会起作用。 任何人都可以建议我Byte副本的Byte副本,以便我的代码可以复制几百MB的文件。 缓冲区是2048。 这是我的代码的样子: static void copyFiles(SmbFile[] files, String parent) throws IOException { SmbFileInputStream input = null; FileOutputStream output = null; BufferedInputStream buf_input = null; try { for (SmbFile f : files) { System.out.println(“Working on files :” + f.getName()); if (f.isDirectory()) { File folderToBeCreated = new File(parent+f.getName()); if (!folderToBeCreated.exists()) { folderToBeCreated.mkdir(); System.out.println(“Folder name […]

在Java中绘制像素的最快方法是什么

我有一些代码可以在随机位置生成粒子,并以随机方向和速度移动。 每次迭代循环,我移动所有粒子,并在我的jpanel上调用重绘。 对于1,000个粒子,我每秒大约需要20到30帧。 我计划最终拥有100,000到1,000,000个粒子。 在绘画中,如果窗口的大小发生变化,我只会创建一个新的bufferedimage。 我将像素绘制到bufferedimage,然后调用drawImage来显示图像。 每个粒子都是一个像素,我已经确定所有的时间都用于实际绘制像素。 因此,增加粒子数将大大降低帧速率。 我尝试过g.drawline(x,y,x + 1,y),img.setRGB(x,y,color),通过调用img.getRaster()得到一个像素数组.getDataBuffer()。getData() ,然后设置pixelData [y * width + x] = color。 我只是通过这些不同的绘制像素的方式在帧速率上得到一个小的差异。 这是我的问题:绘制像素的最快方法是什么? bufferedimage甚至可以走了吗? 谢谢。

什么是Java中最快的循环同步(ExecutorService与CyclicBarrier vs.X)?

哪个Java同步构造可能为具有固定数量线程的并发迭代处理场景提供最佳性能,如下所述? 在我自己试验了一段时间后(使用ExecutorService和CyclicBarrier)并对结果感到有些惊讶,我会感谢一些专家建议和一些新想法。 这里的现有问题似乎并不主要关注绩效,因此这个新问题。 提前致谢! 该应用程序的核心是一个简单的迭代数据处理算法,与Mac Pro上8个内核的计算负载并行,运行OS X 10.6和Java 1.6.0_07。 要处理的数据被分成8个块,每个块被送到Runnable,由固定数量的线程之一执行。 并行化算法是相当简单的,它在function上按预期工作,但它的性能还不是我认为的可能。 该应用程序似乎花了很多时间在系统调用同步,所以经过一些分析后,我想知道我是否选择了最合适的同步机制。 该算法的一个关键要求是它需要分阶段进行,因此线程需要在每个阶段结束时进行同步。 主线程准备工作(非常低的开销),将其传递给线程,让它们处理它,然后在完成所有线程后继续,重新安排工作(再次非常低的开销)并重复循环。 该机器专用于此任务,通过使用预分配项的每线程池来最小化垃圾收集,并且可以修复线程数(没有传入请求等,每个CPU核心只有一个线程)。 V1 – ExecutorService 我的第一个实现使用了一个带有8个工作线程的ExecutorService。 该程序创建8个任务来完成工作,然后让他们处理它,大致如下: // create one thread per CPU executorService = Executors.newFixedThreadPool( 8 ); … // now process data in cycles while( …) { // package data into 8 work items … // create one Callable task per […]

System.arrayCopy很慢

我一直在尝试测量System.arrayCopy与Arrays.copyOf的性能,以便正确选择其中一个。 仅仅为了基准测试我也添加了手动副本,结果让我感到惊讶。 显然我错过了一些非常重要的东西,请你,告诉我,它是什么? 实现如下(参见前4种方法)。 public class ArrayCopy { public static int[] createArray( int size ) { int[] array = new int[size]; Random r = new Random(); for ( int i = 0; i < size; i++ ) { array[i] = r.nextInt(); } return array; } public static int[] copyByArraysCopyOf( int[] array, int size ) { […]

UseConcMarkSweepGC vs UseParallelGC

我目前遇到很长时间的垃圾收集问题。 请参阅以下内容。 我目前的设置是我使用-Xms1g和-Xmx3g。 我的应用程序使用的是java 1.4.2。 我没有设置任何垃圾收集标志。 从它的外观来看,3gb是不够的,我真的有很多垃圾收集的对象。 题: 我应该改变我的垃圾收集算法吗? 我该怎么用? 是否更好地使用-XX:+UseParallelGC or -XX:+UseConcMarkSweepGC 或者我应该使用这种组合 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 占用内存的主要是报告数据而不是缓存数据。 此外,该机器有16GB的内存,我打算将堆增加到8GB。 这两个选项之间有什么区别,因为我仍然觉得很难理解。 该机器有多个处理器。 我可以拍摄最多5秒,但30至70秒真的很难。 谢谢您的帮助。 Line 151493: [14/Jan/2012:11:47:48] WARNING ( 8710): CORE3283: stderr: [GC 1632936K->1020739K(2050552K), 1.2462436 secs] Line 157710: [14/Jan/2012:11:53:38] WARNING ( 8710): CORE3283: stderr: [GC 1670531K->1058755K(2050552K), 1.1555375 secs] Line 163840: [14/Jan/2012:12:00:42] WARNING ( 8710): CORE3283: stderr: [GC […]

有效地将java字符串转换为其等效的枚举

给定一个字符串我想在恒定时间内获得它的枚举。 我有一个定义类似于问题所示的枚举。 创建字符串枚举的最佳方法? public enum Strings { STRING_ONE(“ONE”), STRING_TWO(“TWO”) ; private final String text; /** * @param text */ private Strings(final String text) { this.text = text; } /* (non-Javadoc) * @see java.lang.Enum#toString() */ @Override public String toString() { return text; } } 如果我现在得到一个字符串(说“TWO”),有没有办法看看它是否存在,如果它存在,那么有一种方法可以定义一个将返回枚举值的方法(例如,如果我通过“TWO” “,我应该回来”Strings.STRING_TWO“?

ExecutorService Future ::变得非常慢

我正在并行化一个非常复杂的程序来加快速度。 为此,我大部分时间都使用ExecutorService 。 到目前为止它工作得很好,但后来我注意到只有一行代码使我的程序运行速度尽可能快一半。 这是exactScore.get()的行。 我不知道为什么,但它有时需要更多的0.1秒来获得Future Object的double值。 为什么是这样? 如何处理它运行得更快? 在multithreading中有没有办法直接在Double[]编写? 谢谢 int processors = Runtime.getRuntime().availableProcessors(); ExecutorService service = Executors.newFixedThreadPool(processors); // initialize output Double[] presortedExScores = new Double[sortedHeuScores.length]; for(int i =0; i < sortedHeuScores.length; i++ ){ final int index = i; final Collection formulas_for_exact_method = multimap.get(sortedHeuScores[i]); for (final MolecularFormula formula : formulas_for_exact_method){ Future exactScore = service.submit(new […]

在很多情况下优化Java switch语句?

我目前正在使用switch语句来处理有大约20种不同情况的传入消息类型。 其中一些案例比其他案件更有可能发生数量级。 热点编译器是否能够优化检查案例的顺序以找到要执行的正确案例,或者我应该构建我的代码以便最常见的案例首先出现: switch(messageType) { case MOST_COMMON: // handle it break; … case LEAST_COMMON: // handle it break; } 所有案件都是互相排斥的。 我会更好地使用策略模式和消息类型的Map查找吗? 性能是关键问题,因为我每秒处理数千条消息,并且正在尝试减少对象创建和方法调用开销。 非常感谢, 克里斯 编辑:感谢指点。 messageType是一个具有较小值范围的int,因此看起来它将编译为“tableswitch”字节码,因此无需重新排序。 JVM规范的相关部分在http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942