Tag: 性能

我什么时候应该使用原语而不是包装对象?

实际上这是一个类似的主题,几乎没有实际价值。 据我所知,原语表现更好,应该在任何地方使用,除了需要与对象相关的function(例如null检查)的情况。 对?

Java性能:true与Boolean.TRUE

哪个在性能和高效内存使用方面更好? Boolean isItTrue(arg){ return Boolean.TRUE; } boolean isItTrue(arg){ return Boolean.TRUE } Boolean isItTrue(arg){ return true; } boolean isItTrue(arg){ return true; } 使用基本类型应该更快更容易,但另一方面,当使用对静态对象的引用时,不会创建新值。 或者可能是它在编译器级别上进行了优化,并且所有的true和false都被静态对象的引用所取代以节省内存?

在Java中将整数数组写入文件的最快方法?

正如标题所说,我正在寻找将整数数组写入文件的最快方法。 这些arrays的大小会有所不同,实际上可以包含2500到25 000 000个整数。 这是我目前使用的代码: DataOutputStream writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename))); for (int d : data) writer.writeInt(d); 鉴于DataOutputStream有一个写字节数组的方法,我尝试将int数组转换为如下字节数组: private static byte[] integersToBytes(int[] values) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); for (int i = 0; i < values.length; ++i) { dos.writeInt(values[i]); } return baos.toByteArray(); } 并像这样: private static […]

如何减少Scala(/ Java)启动开销?

我对Java世界一无所知(我主要做的是C / Python)但是Scala看起来很有趣,可以吸引我。我遇到的一个问题是巨大的启动开销 – 最小0.3秒,如果我更多m使用解释器而不是编译,相比之下,Python或C实际上是0。所以即使语言比Python快几十倍,如果我试图将它用于简单的任务,它仍然会相当慢实践。 有没有办法减少这个时间,或者它是JVM中不可避免的一部分+ Scala程序所需(隐式)导入的数量?

将文件写入ServletOutputStream的最有效方法

ServletOutputStream output = response.getOutputStream(); output.write(byte[]); 将文件写入javax.servlet.ServletOutputStream的最有效方法是什么? 编辑: 如果使用NIO,这不会更有效吗?

在Java中增长数组的大多数内存有效方法?

我不太关心时间效率(操作很少),而是关于内存效率: 我可以在没有暂时拥有所有值两次的情况下增长数组吗? 是否有更有效的方法来扩展大型arrays而不是创建新arrays并复制所有值? 比如,将它与一个新的连接起来? 将固定大小的数组存储在另一个数组中并重新分配/复制那个顶级数组怎么样? 这会留下实际价值吗? 我知道ArrayList,但是我需要很多关于访问数组的控制,并且访问需要非常快。 例如,我认为我更喜欢a[i]到al.get(i) 。 我关心这个问题的主要原因是所讨论的数组(或许多这样的数组)可能很好地占据主内存的足够大部分,在丢弃原始文件之前创建双倍大小的副本的通常策略可能不起作用出。 这可能意味着我需要重新考虑整体战略(或我的硬件建议)。

Java 8嵌套循环,包含流和性能

为了练习Java 8流,我尝试将以下嵌套循环转换为Java 8流API。 它计算a ^ b(a,b <100)的最大数字总和,并在我的Core i5 760上占用~0.135s。 public static int digitSum(BigInteger x) { int sum = 0; for(char c: x.toString().toCharArray()) {sum+=Integer.valueOf(c+””);} return sum; } @Test public void solve() { int max = 0; for(int i=1;i<100;i++) for(int j=1;j<100;j++) max = Math.max(max,digitSum(BigInteger.valueOf(i).pow(j))); System.out.println(max); } 我的解决方案,我希望由于并行性而更快,实际上需要0.25秒(没有parallel() 0.19s): int max = IntStream.range(1,100).parallel() .map(i -> IntStream.range(1, 100) .map(j->digitSum(BigInteger.valueOf(i).pow(j))) […]

确定数组是否包含两个等于某个总和的元素?

// Checks whether the array contains two elements whose sum is s. // Input: A list of numbers and an integer s // Output: return True if the answer is yes, else return False public static boolean calvalue (int[] numbers, int s){ for (int i=0; i< numbers.length; i++){ for (int j=i+1; j<numbers.length;j++){ if (numbers[i] < […]

Java foreach效率

我有这样的事情: Map myMap = …; for(String key : myMap.keySet()) { System.out.println(key); System.out.println(myMap.get(key)); } 在foreach循环中调用myMap.keySet()是一次吗? 我想是的,但想要你的意见。 我想知道以这种方式使用foreach( myMap.keySet() )是否会对性能产生影响,或者它与以下内容相同: Set keySet = myMap.keySet(); for (String key : keySet) { … }

何时使用Array,Buffer或direct Buffer

题 在编写用于OpenGL库的Matrix类时,我遇到了是否使用Java数组或缓冲区策略来存储数据的问题(JOGL为Matrix操作提供了直接缓冲区复制)。 为了分析这个,我写了一个小的性能测试程序,它比较了Arrays与Buffers vs direct Buffers的循环和批量操作的相对速度。 我想在这里与你分享我的成果(因为我觉得它们很有趣)。 请随时评论和/或指出任何错误。 可以在pastebin.com/is7UaiMV上查看代码。 笔记 循环读取数组实现为A [i] = B [i] ,否则JIT优化器将完全删除该代码。 实际var = A [i]似乎几乎相同。 在数组大小为10,000的示例结果中,JIT优化器很可能已使用类似System.arraycopy的实现替换了循环数组访问。 没有批量获取缓冲区 – >缓冲区,因为Java将A.get(B)实现为B.put(A) ,因此结果与批量放置结果相同。 结论 在几乎所有情况下,强烈建议使用Java内部数组。 不仅输出/获取速度大大加快,JIT还能够对最终代码执行更好的优化。 只有在以下两种情况适用时才应使用缓冲区: 您需要处理大量数据。 该数据大部分或总是经过批量处理 。 请注意,后备缓冲区具有Java数组,用于补偿缓冲区的内容。 建议在此缓冲区上执行操作,而不是循环put / get。 只有在担心内存使用情况且永远不会访问基础数据时, 才应使用直接缓冲区。 它们比非直接缓冲区稍慢,如果访问基础数据则要慢得多,但使用的内存较少。 此外,在使用直接缓冲区时,将非字节数据(如float-arrays)转换为字节时会产生额外的开销。 有关详细信息,请参阅此处 为什么只有ByteBuffers在使用直接缓冲区时才有用 NIO的内部开销以及减缓缓冲区的速度 样本结果 注意:百分比仅为便于阅读而没有实际意义。 使用大小为16的数组和10,000,000次迭代…… — Array tests: —————————————– Loop-write array: 87.29 ms 11,52% […]