Tag: 优化

如何在HotSpot JVM中实现模运算符?

我知道模数运算可以使用一个小的明智的魔法来优化,其中除数是2的幂… 并且可能这是JIT编译器的优化?

字符串的plus运算符的线程安全性,包括优化

这篇文章说a += b相当于 a = new StringBuilder() .append(a) .append(b) .toString(); 假设我有这个代码: public class MultiThreadingClass extends SomeThirdPartyClassThatExtendsObject{ public void beginmt(String st) throws IOException { //st is a thread number st = new File(“c:\\somepath”).getCanonicalPath()+”\\”+st; System.out.println(st); } } 假设beginmt在MultiThreading类的单个实例上同时运行多次(线程号为1到15500)。 可能有这样的情况,它可以打印以下,即一些线程数丢失,一些数字加倍? c:\somepath\2 c:\somepath\1 c:\somepath\1 c:\somepath\4 c:\somepath\5 c:\somepath\6 c:\somepath\7 c:\somepath\8 c:\somepath\8 c:\somepath\10 … 编辑: 是否安全地说+运算符不会进入某些不安全的发布问题? 我认为StringBuilder可以优化为类似于实例变量的东西,在这种情况下它可能会被不安全地发布。 编辑2: 就JLS,上述post以及上述代码的类似类文件进行检查,要使用的StringBuilders似乎必须包含在不同的堆栈帧中。 但是,我仍然想检查某种forms的激进优化是否会导致StringBuilders以某种方式被集中式StringBuilder替换。 这听起来是可能的,因为当优化器预测对象刚刚以非常数方式实现时实际上这样的对象可以是常量时,优化器优化是合乎逻辑的。 […]

是否优化后使用的变量定义?

考虑以下方法: private static long maskAndNegate(long l) { int numberOfLeadingZeros = Long.numberOfLeadingZeros(l) long mask = CustomBitSet.masks[numberOfLeadingZeros]; long result = (~l) & mask; return result; } 该方法可以缩写为: private static long maskAndNegate(long l) { return (~l) & CustomBitSet.masks[Long.numberOfLeadingZeros(l)]; } 这两个表示在实际运行时间是否相等? 换句话说,Java编译器是否优化了额外变量的不必要定义,我已将其置于可读性和调试之中?

我应该缓存System.getProperty(“line.separator”)吗?

考虑这样的方法: @Override public String toString() { final StringBuilder sb = new StringBuilder(); for (final Room room : map) { sb.append(room.toString()); sb.append(System.getProperty(“line.separator”)); // THIS IS IMPORTANT } return sb.toString(); } System.getProperty(“line.separator”)可以多次调用。 我应该使用public final static String lineSeperator = System.getProperty(“line.separator”)缓存此值,以后只使用lineSeperator吗? 或System.getProperty(“line.separator”)与使用静态字段一样快?

为什么javac不优化甚至简单的代码?

给出以下代码: public class MainClass { public static int f(){ int i=0; i++; return i; } } 编译器javac生成以下代码: Compiled from “MainClass.java” public class latte_jvm.MainClass { public static int f(); Code: 0: iconst_0 1: istore_0 2: iinc 0, 1 5: iload_0 6: ireturn } 函数f确实很简单 – 它只返回1.它是如此直接翻译,以至于我很难相信java编译器会进行任何优化。 为什么java编译器创建者决定不在编译阶段进行这样的优化?

Java处理大量数据

我有一个需要显示大量数据的Java应用程序(大约100万个数据点)。 数据并非都需要同时显示,而是仅在用户请求时显示。 该应用程序是一个桌面应用程序,不与应用程序服务器一起运行或命中任何集中式数据库。 我的想法是在机器上运行数据库并在那里加载数据。 数据库将在大多数时间只读取,因此我应该能够索引以帮助优化查询。 如果我在本地系统上运行,我不确定是否应该尝试实现一些缓存(我不确定查询运行的速度有多快,我目前正在研究它们)。 这是解决问题的合理方法还是会有更好的方法? 谢谢,杰夫

是否有可能使用常规JVM创建一个高优先级线程,一个不会被任何其他线程抢占的线程?

所以我的目标很简单:我想在不使用RTSJ(实时Java VM)或其他专有JVM的情况下在Java中创建高优先级线程。 让我们假设您从未创建任何垃圾,因此GC不会成为罪魁祸首。 我们假设我有4个处理器。 它可行吗? 如果没有,是否可以计算我的线程被抢占的次数? @Gray:我希望尽可能少的延迟实时响应,而不必去RTSJ和特殊操作系统 @sarnold:你是对的。 如果您在JVM级别中实现了这一点,但操作系统不会抢占您的JVM,则在较低级别会遇到相同的问题。 让我们假设有可能破解和/或使用调整不这样做的Linux发行版。 @StephenC:我已经知道它无法完成。 这就是我想要这样做的原因。 🙂 如果我至少可以检测到抢占,我将有办法衡量我的进步。

最小化Java函数调用开销

我有一段代码 ,在我运行的每个测试中,函数调用都会产生大量的开销。 代码是一个紧密循环,对数组的每个元素执行一个非常简单的函数(包含4-8百万个int )。 运行代码,主要包含 for (int y = 1; y < h; ++y) { for (int x = 1; x < w; ++x) { final int p = y * s + x; n[p] = f.apply(d, s, x, y); } } 执行类似的事情 (final int[] d, final int s, final int x, final int y) […]

字符串大写 – 更好的方式

什么方法的资本化更好? 矿: char[] charArray = string.toCharArray(); charArray[0] = Character.toUpperCase(charArray[0]); return new String(charArray); 要么 commons lang – StringUtils.capitalize: return new StringBuffer(strLen) .append(Character.toTitleCase(str.charAt(0))) .append(str.substring(1)) .toString(); 我认为我的更好,但我宁愿问。

大输入上的慢字符串连接

我写了一个n-ary树ADT工作正常。 但是,我需要将其序列化存储在一个变量调用类中。 例如。 DomTree a = Data.createTreeInstance(“very_large_file.xml”); String x = a.toString(); 我编写的方法完全符合我的需要,但在非常大的输入上它需要永远(在100MB xml文件上20分钟) – 我已经定时方法并从xml文件构建树很快,但是调用如上所示的toString()非常慢。 @Override public String toString(){ return printTree(this); } public String printTree(AbstractTree tree){ if (tree.isLeaf()){ return tree.getNodeName(); }else{ String tStr = tree.getNodeName() + “(“; int i = 0; Iterator<AbstractTree> child = tree.getChildren().iterator(); while (i < tree.getChildren().size() – 1){ tStr += printTree(child.next()) + […]