Tag: 性能

性能方面,番石榴图书馆有多好?

我已经浏览了Google Guava库,并在其中创建了许多优秀,可用的数据结构。 如果有其他人使用过它,那么你可以提供有关它与大数据集一起使用时的表现的反馈吗? 基本上我正在为其运营寻找BigO表示法。 提前致谢

DecimalFormat.format()的更快替代方案?

为了提高性能,我使用VisualVM采样器分析了我的一个应用程序,使用的最小采样周期为20ms。 根据分析器,主线程在DecimalFormat.format()方法中花费了近四分之一的CPU时间。 我使用带有0.000000模式的DecimalFormat.format()将double数字“转换”为具有正好六位小数的字符串表示。 我知道这种方法相对昂贵并且被称为很多次,但我仍然对这些结果感到有些惊讶。 这种采样分析仪的结果在多大程度上准确? 我将如何validation它们 – 最好不要求助于仪器分析仪? 对于我的用例,是否有更快的替代DecimalFormat ? 推出自己的NumberFormat子类是否有意义? 更新: 我创建了一个微基准来比较以下三种方法的性能: DecimalFormat.format() :单个DecimalFormat对象重复使用多次。 String.format() :多个独立调用。 在内部,这种方法归结为 public static String format(String format, Object … args) { return new Formatter().format(format, args).toString(); } 因此我期望它的性能与Formatter.format()非常相似。 Formatter.format() :单个Formatter对象重复使用多次。 此方法稍微不方便 – 使用默认构造函数创建的Formatter对象将format()方法创建的所有字符串追加到内部StringBuilder对象,该对象无法正确访问,因此无法清除。 因此,对format()多次调用将创建所有结果字符串的串联 。 为了解决这个问题,我提供了自己的StringBuilder实例,我在使用之前通过setLength(0)调用清除了该实例。 结果有趣: DecimalFormat.format()是每次调用1.4us的基线。 String.format()在每次调用2.7us时减慢了两倍。 Formatter.format()在每次调用2.5us时也慢了两倍。 现在看来, DecimalFormat.format()仍然是这些替代品中最快的。

Java中字符串池的基础机制?

我很好奇为什么可以在不调用new String()情况下创建new String() ,因为API提到它是class java.lang.String 那么我们如何才能使用String s=”hi”而不是String s=new String(“hi”) ? 这篇文章阐明了使用==运算符和缺少new并说这是由于String文字被JVM 中断或从文字池中取出,因此Strings是不可变的。 看到诸如此类的陈述 String s=”hi” 第一次真正发生了什么? JVM是否将其替换为String s=new String(“hi”) ,其中创建了一个Object并且将”hi”添加到String文本池中 ,因此后续调用(如String s1=”hi”取自池? 这是基础机制的运作方式吗? 如果是的话,那就是 String s=new String(“Test”); String s1=”Test”; 同样的 String s=”Test”; String s1=”Test”; 在内存利用率和效率方面 ? 另外,有什么办法可以访问字符串池来检查它中存在多少String文字,占用了多少空间等等?

Java:Getter和setter比直接访问更快?

我测试了我在Linux上网本上使用VisualVM 1.3.7编写的Java光线跟踪器的性能。 我用剖析器测量过。 为了好玩,我测试了使用getter和setter以及直接访问字段之间的区别。 getter和setter是标准代码,没有添加。 我没想到会有任何分歧。 但是直接访问代码的速度较慢。 这是我在Vector3D中测试的样本: public float dot(Vector3D other) { return x * other.x + y * other.y + z * other.z; } 时间:1542毫秒/ 1,000,000次调用 public float dot(Vector3D other) { return getX() * other.getX() + getY() * other.getY() + getZ() * other.getZ(); } 时间:1453毫秒/ 1,000,000次调用 我没有在微基准测试中测试它,而是在光线跟踪器中测试它。 我测试代码的方式: 我用第一个代码启动了程序并进行了设置。 光线跟踪器尚未运行。 我启动了分析器并在初始化完成后等了一会儿。 我开始了一个光线追踪器。 当VisualVM显示足够的调用时,我停止了探查器并等了一会儿。 […]

为什么哈希表通过加倍来resize?

在线检查java和google搜索哈希表代码示例,似乎通过加倍来完成表的大小调整。 但是大多数教科书都说桌子的最佳尺寸是素数。 所以我的问题是: 加倍的方法是因为: 它易于实现,或 找到素数太低效了(但我认为找到下一个素数超过n+=2并使用模数测试素数是O(loglogN)这很便宜) 或者这是我的误解,只有某些散列表变体只需要主表大小? 更新: 某些属性需要使用素数在教科书中呈现的方式(例如,二次探测需要一个素数表来certificate,例如,如果一个表不是完整的项目X将被插入)。 发布为重复的链接一般要求增加任何数字,例如25%或下一个素数,并且接受的答案表明我们加倍以使resize操作“罕见”,因此我们可以保证摊销时间。 这并没有回答这样一个问题:使用一个表格大小是素数并且使用素数来resize甚至大于两倍。 因此,我们的想法是保持主要大小的属性考虑resize开销

hibernate关系映射/加速批量插入

我有5个MySQL InnoDB表: Test,InputInvoice,InputLine,OutputInvoice,OutputLine每个表都映射并在Hibernate中运行。 我玩过使用StatelessSession / Session和JDBC批量大小。 我删除了任何生成器类以让MySQL处理id生成 – 但它仍然执行速度很慢。 这些表中的每一个都在java类中表示,并相应地映射到hibernate中。 目前,当需要将数据写出来时,如果我使用StatelessSession,我会遍历对象并执行session.save(Object)或session.insert(Object) 。 当我的行数达到最大jdbc批量大小(50)时,我也进行刷新和清除(当使用Session时)。 如果我在拥有对象并执行session.save(master)而不是每个对象的’parent’类中拥有它们会更快吗? 如果我在主/容器类中使用它们,我如何在hibernate中映射它以反映关系? 容器类实际上不是它自己的表,而是一个基于两个索引run_id(int)和line(int)的关系。 另一个方向是:如何让Hibernate进行多行插入?

如何使用BigDecimal会影响应用程序性能?

我想使用BigDecimal来表示低延迟交易应用程序中的任意精度数字,如价格和金额,每秒有数千个订单和执行报告。 我不会对它们进行很多数学运算,所以问题不在于BigDecimal本身的性能,而在于大量BigDecimal对象会如何影响应用程序的性能。 我担心的是,大量短命的BigDecimal对象会给GC带来压力并导致CMS收集器中更大的Stop-The-World暂停 – 这绝对是我想要避免的。 您能否确认我的疑虑并建议使用BigD的替代方案? 此外,如果您认为我的担忧是错误的 – 请解释原因。 更新 : 感谢所有回答的人。 我现在确信使用BigDecimal会损害我的应用程序的延迟(即使我仍然计划测量它)。 目前我们决定坚持使用“非常非OOP”解决方案(但没有精确命中) – 使用两个int ,一个用于尾数,另一个用于指数。 这背后的基本原理是基元放在堆栈上,而不是堆,因此不受垃圾收集的影响。

使用System.out和PrintWriter写入控制台

在阅读Java I / O时,我意识到有两种方法可以写入标准输出。 以下是使用这两种技术的代码段 import java.io.*; public class ConsoleIO { public static void main(String[] args) { System.out.println(“Method 1”); PrintWriter writer = new PrintWriter(System.out); writer.println(“Method 2”); writer.flush(); writer.close(); } } 使用一个优于另一个是否有任何性能优势?

if(null check)-else vs try catch(NullPointerException)哪个更有效?

以下哪三项function更有效; public String getmConnectedDeviceName1() { if(null != mServerDevice) { return mServerDevice.getName(); } else { return null; } } public String getmConnectedDeviceName2() { return mServerDevice == null ? null : mServerDevice.getName(); } public String getmConnectedDeviceName3() { try{ return mServerDevice.getName(); } catch(NullPointerException e) { return null; } } 请回复具体可接受的逻辑。

如何提高ThreadLocal包装的SimpleDateFormat的性能?

这是在RHEL上的Java 7(51)上有24个内核我们注意到,当我们增加线程池大小时,包含在本地线程中的java SimpleDateFormat的平均响应时间会增加。 这是预期的吗? 或者,我只是在做一些愚蠢的事情? 测试程序 public class DateFormatterLoadTest { private static final Logger LOG = Logger.getLogger(DateFormatterLoadTest .class); private final static int CONCURRENCY = 10; public static void main(String[] args) throws Exception { final AtomicLong total = new AtomicLong(0); ExecutorService es = Executors.newFixedThreadPool(CONCURRENCY); final CountDownLatch cdl = new CountDownLatch(CONCURRENCY); for (int i = 0; i […]