Tag: 优化

当Java对象的所有成员都为null时,它会使用多少内存?

假设Java对象只占用对象引用的8个字节是正确的,只要它的所有成员都设置为null或者成员的定义是否因某种原因已经占用了实例中的空间? 换句话说,如果我有一大堆我想要节省空间的对象,我可以依靠将未使用的成员设置为null来减少内存占用吗?

我的Binary Gap代码解决方案是否正确? 我应该改进什么?

正整数N内的二进制间隙是连续零的任何最大序列,其由N的二进制表示中的两端的1包围。 例如,数字9具有二进制表示1001并且包含长度为2的二进制间隙。数字529具有二进制表示1000010001并且包含两个二进制间隙:长度为4且长度为3的一个。数字20具有二进制表示10100并包含一个长度为1的二进制间隙。数字15具有二进制表示1111并且没有二进制间隙。 写一个函数: int solution(int N); 在给定正整数N的情况下,返回其最长二进制间隙的长度。 如果N不包含二进制间隙,则该函数应返回0。 例如,给定N = 1041,函数应返回5,因为N具有二进制表示10000010001,因此其最长的二进制间隙长度为5。 public int solution(int n) { // write your code in Java SE 8 String binaryRep = Integer.toBinaryString(n); System.out.println(“Binary Representation of ” + n + ” = ” + binaryRep); List strList = new ArrayList(); int count = 0; for (int i = 0; i […]

初始化HashMap的最佳方法

我通常会这样做 HashMap dictionary = new HashMap(); 我开始考虑它,据我所知, HashMap是通过哈希表实现的。 使用散列将对象存储在表中,以查找它们应存储在表中的位置。 我没有在dictionary构造上设置大小这一事实是否会降低性能? 即建设期间哈希表的大小是多少? 当元素增加时,是否需要为表分配新内存? 或者我对这里的概念感到困惑? 默认容量和负载是否足够,或者我应该花时间查看实际数字?

将浮点值舍入到java中最接近的整数的最有效方法是什么?

我已经看到很多有关舍入浮动值的SO的讨论,但考虑到效率方面没有可靠的问答。 所以这里是: 将浮点值舍入到最接近的整数的最有效(但正确)方法是什么? (int) (mFloat + 0.5); 要么 Math.round(mFloat); 要么 FloatMath.floor(mFloat + 0.5); 或者是其他东西? 我最好使用标准java库中可用的东西,而不是我必须导入的一些外部库。

有没有办法告诉JVM在处理之前优化我的代码?

我有一个方法,第一次执行需要很长时间。 但经过几次调用后,时间缩短了大约30倍。 因此,为了使我的应用程序更快地响应用户交互,我使用一些关于应用程序初始化的示例数据“预热”此方法(5次)。 但这会增加应用启动时间。 我读过,JVM可以优化并编译我的java代码到本机,从而加快速度。 我想知道 – 也许有一些方法可以明确告诉JVM我希望在启动应用程序时编译这个方法?

是否有可能在Java中有效地实现seqlock?

另一个问题让我想知道是否可以使用Java中的易失性版本计数器有效地实现seqlock 。 这是一个典型的实现,因为只有一个编写器线程的情况: class Seqlock { private volatile long version = 0; private final byte[] data = new byte[10]; void write(byte[] newData) { version++; // 1 System.arraycopy(newData, 0, data, 0, data.length); // 2 version++; // 3 } byte[] read() { long v1, v2; byte[] ret = new byte[data.length]; do { v1 = version; // 4 […]

C,C ++和Java中的提升/重新排序:变量声明必须始终位于上下文中吗?

我读了一些关于提升和重新排序的内容 ,因此似乎Java VM可能会选择提升某些表达式。 我还读到了在Javascript中提升函数声明的问题。 第一个问题:有人可以确认在C,C ++和Java中是否通常存在吊装? 或者它们都依赖于编译器/优化? 我读了很多示例C代码,它们总是在任何断言或边界条件之前将变量声明置于顶部。 我认为在变量声明之前执行所有断言和边界情况会更快一些,因为函数可能只是终止。 主要问题:变量声明必须始终在上下文中排在最前面吗? (这里有提升工作吗?)或者编译器是否通过首先检查这些独立的断言和边界情况 (在无关变量声明之前)自动优化代码? 这是一个相关的例子: void MergeSort(struct node** headRef) { struct node* a; struct node* b; if ((*headRef == NULL) || ((*headRef)->next == NULL)) { return; } FrontBackSplit(*headRef, &a, &b); MergeSort(&a); MergeSort(&b); *headRef = SortedMerge(a, b); } 如上所示,边界情况不依赖于变量“a”和“b”。 因此,将边界情况置于变量声明之上会使它稍快一些吗? 更新 : 上面的例子并不像我希望的那样好,因为变量“a”和“b”只是声明,而不是在那里初始化。 在我们确实需要使用它们之前,编译器会忽略声明。 我使用初始化检查了GNU GCC程序集的变量声明,程序集具有不同的执行顺序。 编译器没有改变我对独立断言和边界情况的排序。 因此,重新排序这些断言和边界情况会改变程序集,从而改变机器运行它们的方式。 […]

arraylist与数组中原始类型的包装

在“Core java 1”中我读过 注意:ArrayList的效率远低于int []数组,因为每个值都单独包装在对象中。 当程序员的便利性比效率更重要时,您只希望将此构造用于小型集合。 但是在我的软件中,由于一些要求,我已经使用了Arraylist而不是普通的arrays,尽管“该软件应该具有高性能,在我阅读引用的文本后,我开始恐慌!” 我可以改变的一件事是将双变量更改为Double以防止自动装箱,我不知道这是否值得,在下一个样本算法中 public void multiply(final double val) { final int rows = getSize1(); final int cols = getSize2(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { this.get(i).set(j, this.get(i).get(j) * val); } } } 我的问题是改变double到Double会有所不同吗? 或者这是微观优化,不会影响任何事情? 请记住,我可能正在使用大型矩阵。我应该考虑重新设计整个程序吗?

为什么本机String getBytes方法比自定义实现的getBytesFast慢?

运行以下代码时,Java String的本机方法getBytes()的执行似乎比自定义getBytesFast()实现慢 。 您可以使用Arrays.equals(str.getBytes(), getBytesFast(str))来validation两个字节数组是否相等。 getBytesFast实现是此编程技巧文章(1997)中包含的实现的修改版本: http : //java.sun.com/developer/technicalArticles/Programming/Performance/ 我正在寻找一个记录良好的答案,解释为什么本机实现比自定义实现慢。 package com.test; public class Performance { public static void main(String args[]) { final String str = “This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance […]

比较字符串的最快方法(文字和数字)

我有一个与字符串比较相关的性能问题(在Java中)。 我正在开发一个需要对一个巨大的列表进行排序的项目(Eclipse中的TableViewer)。 无论如何,我已经确定了要比较的字符串compareTo()的调用瓶颈。 有没有办法优化字符串比较的性能? 我搜索并用谷歌搜索无济于事…… 由于该项目严格限于Win32环境,我认为也许可以利用它… 任何建议将不胜感激。 编辑:我忘了提到我需要数字比较和字符串的字面比较。 EDIT2:目标本质上是加速用户界面,因为每次单击表头以执行排序时等待几秒是不可接受的。 我正在考虑以某种方式缓存值来加速比较。 由于字符串非常静态,我认为这是可能的。 编辑3:我知道很多人都被try() – catch()事情所困扰。 实际上这不是一个问题,因为即使我删除该代码并只执行catch-block(单个compareTo()),它仍然以与原始代码几乎相同的速度执行。 但是,如果我也注释掉compareTo(); 只留下比较function的开销(获得标签等),它快速闪电。 所以我仍然需要一种比较字符串的更好方法。 通过缓存或做一些其他魔术。 不幸的是,不可能改变排序算法 – 但我怀疑它是那么慢,因为它成功地快速排序纯整数。 澄清: compare函数是作为TableViewer框架的一部分实现的,用于执行排序操作,这意味着我没有实现特定的排序算法,而是由SWT / JFace实现。 我只是实现了比较function。 更有趣的是,用于排序双精度的代码比字符串比较更快 。 使用只有数字而不是实际的文字字符串对列进行排序更快….这使我得出结论,在compareTo()方法中发生了一些可疑的事情…… 这是该function的核心: // e1Label and e2Label is Strings to be compared // // Be smart about the comparison and use non-lexical comparison if // possible (ie […]