Tag: 优化

具有给定精度的快速双字符串转换

我需要将double转换为具有给定精度的字符串。 String.format(“%.3f”, value) (或DecimalFormat)完成了这项工作,但基准测试表明,与不是非常快的Double.toString转换相比,它速度很慢(在我的机器上转换100万个数字大约需要1-3秒) )。 有没有更好的方法呢? 更新:基准测试结果 从0到1000000的随机数,结果是每毫秒的运算(Java 1.7.0_45) Benchmark Mean Mean error Units String_format 747.394 13.197 ops/ms BigDecimal_toPlainString 1349.552 31.144 ops/ms DecimalFormat_format 1890.917 28.886 ops/ms Double_toString 3341.941 85.453 ops/ms DoubleFormatUtil_formatDouble 7760.968 87.630 ops/ms SO_User_format 14269.388 168.206 ops/ms 更新: Java 10,+ ryu Mode Cnt Score Error Units String_format thrpt 20 998.741 ± 52.704 ops/ms BigDecimal_toPlainString […]

为什么Arrays.equals(char ,char )比其他所有版本快8倍?

短篇故事 基于我对几个不同的Oracle和OpenJDK实现的测试,似乎Arrays.equals(char[], char[])比其他类型的所有其他变体快8倍 。 如果你的应用程序的性能与比较数组的相等性非常相关,那么这意味着你非常希望将所有数据强制转换为char[] ,只是为了获得这种神奇的性能提升。 很长的故事 最近我写了一些高性能代码,它使用Arrays.equals(…)来比较用于索引到结构的键。 密钥可能很长,并且通常只在后面的字节中有所不同,因此这种方法的性能非常重要。 有一次我使用了char[]类型的键,但作为泛化服务的一部分并避免来自byte[]和ByteBuffer底层源的一些副本,我将其更改为byte[] 。 突然2 ,许多基本操作的表现下降了约3倍。 我追溯了上述事实: Arrays.equals(char[], char[])似乎在所有其他Arrays.equals()版本中享有特殊状态,包括一个Arrays.equals() short[] ,它在语义上是相同的(并且可以使用相同的底层代码实现,因为签名不会影响equals的行为)。 所以我写了一个JMH基准测试来测试Arrays.equals(…) 1的所有原始变体,而char[]变体压缩所有其他变体,如上所示。 现在,~8x变种的这种优势并没有扩大到更小或更大的arrays – 但它仍然更快。 对于小型arrays,似乎常数因素开始占主导地位,对于较大的arrays,L2 / L3或主内存带宽开始发挥作用(您可以在前面的图中很清楚地看到后者的效果,其中int[]尤其是long[]数组在大尺寸时的性能开始下降。 这是一个相同的测试,但是有一个较小的小数组和较大的大数组: 在这里, char[]仍在踢屁股,就像以前一样。 小数组(仅16个元素)的每个元素时间大约是标准时间的两倍,可能是由于函数开销:在大约0.5 ns /元素时, char[]变体对于整个调用仍然只需要大约7.2纳秒,或者我的机器上大约有19个循环 – 因此少量的方法开销会大量削减运行时间(同样,基准开销本身也是几个循环)。 在大端,缓存和/或内存带宽是一个驱动因素 – long[]变体几乎是int[]变体的2倍。 short[] ,尤其是byte[]变体不是很有效(它们的工作集仍然适合我机器中的L3)。 char[]和所有其他内容之间的区别非常大,对于依赖于数组比较的应用程序(这对某些特定域实际上并不常见),尝试将所有数据放入char[]是值得的利用。 呵呵。 是什么赋予了? char是否得到特殊处理,因为它是一些String方法的基础? 它只是JVM优化方法的另一个例子,它在基准测试中受到很大影响,而不是将相同(明显)的优化扩展到其他原始类型(特别是这里相同的 short )? 0 …并且这甚至都不是那么疯狂 – 考虑各种系统,例如,依赖于(冗长的)散列比较以检查值是否相等,或者哈希映射,其中键是长的或可变大小的。 1我没有在结果中包含boolean[] , float[]和double[]或double以避免使图形混乱,但是对于记录boolean[]和float[]执行与int[]相同,而double[]执行与long[]相同的操作。 根据类型的基础大小,这是有道理的。 […]

Java 7排序“优化”

在Java6中,quicksort和mergesort分别用于Arrays#sort ,用于原始和对象数组。 在Java7中,这些都改变了, DualPivotQuicksort和Timsort。 在新快速排序的来源中,以下评论出现在几个地方(例如第354行): /* * Here and below we use “a[i] = b; i++;” instead * of “a[i++] = b;” due to performance issue. */ 这是一个性能问题? 编译器不会将这些减少到同一个东西吗? 更广泛地说,我自己调查这个的好策略是什么? 我可以运行基准测试,但我更感兴趣的是分析编译代码中的任何差异。 但是,我不知道使用什么工具等。

如何在JSF中减少javax.faces.ViewState

减少JSF中viewstate隐藏字段大小的最佳方法是什么? 我注意到我的视图状态大约是40k,这会下降到客户端并在每次请求时返回到服务器,并且响应通常会发送到服务器,这对用户来说是一个显着的减速。 我的环境JSF 1.2,MyFaces,Tomcat,Tomahawk,RichFaces

逐行阅读STDIN的最快方式?

我正在寻找最经济有效的逐行读取STDIN的方法。 第一行是要测试的条件数。 以下所有行都是条件(字符串),最多为100 000个字符。 我已经尝试过以下内容(加上4次90 000个字符的结果: 带有while循环的扫描仪(7255 ms) Scanner sc = new Scanner(System.in); int numberOfLines = Integer.parseInt(sc.nextLine()); long start = 0; int i = 1; while (i<=numberOfLines){ start = System.currentTimeMillis(); sc.nextLine(); Debug.println((System.currentTimeMillis()-start) + "ms for scanner while"); i++; } 结果: 扫描仪3228ms 扫描仪2264ms 扫描仪1309ms 扫描仪454ms 带有for循环的扫描仪(7078 ms) Scanner sc = new Scanner(System.in); int numberOfLines = Integer.parseInt(sc.nextLine()); […]

加速Java

这实际上是两个问题,但它们非常相似,为了保持简单,我想我只是把它们放在一起: 首先 :鉴于已建立的Java项目,除了简单的代码内优化之外,还有哪些方法可以加快速度? 其次 :在Java中从头开始编写程序时,有哪些好方法可以大大提高性能? 请远离一般优化技术,除非它们是Java特定的 。 我之前曾问过Python和Perl 。 对于Java,我想知道有哪些好的提示/技巧可以提高性能,以及是否有任何特别好的Java分析器。

有效地找到正则表达式的所有重叠匹配

这是与java正则表达式匹配的所有重叠子串的后续。 有没有办法让这段代码更快? public static void allMatches(String text, String regex) { for (int i = 0; i < text.length(); ++i) { for (int j = i + 1; j <= text.length(); ++j) { String positionSpecificPattern = "((?<=^.{"+i+"})("+regex+")(?=.{"+(text.length() – j)+"}$))"; Matcher m = Pattern.compile(positionSpecificPattern).matcher(text); if (m.find()) { System.out.println("Match found: \"" + (m.group()) + "\" at position [" […]

Java:使用异步编程优化应用程序

我必须修改dropwizard应用程序以改善其运行时间。 基本上,该应用程序每天接收大约300万个URL,并下载并解析它们以检测恶意内容。 问题是该应用程序只能处理100万个URL。 当我查看应用程序时,我发现它正在进行大量的顺序调用。 我想要一些关于如何通过使其成为异步或其他技术来改进应用程序的建议。 所需代码如下: – /* Scheduler */ private long triggerDetection(String startDate, String endDate) { for (UrlRequest request : urlRequests) { if (!validateRequests.isWhitelisted(request)) { ContentDetectionClient.detectContent(request); } } } /* Client */ public void detectContent(UrlRequest urlRequest){ Client client = new Client(); URI uri = buildUrl(); /* It returns the URL of this dropwizard application’s […]

Java中的快速像素搜索

我有一个关于java中的像素搜索的问题。 目前,我的Class / Programm正逐像素地搜索,以减慢我的目的。 我不想Java更快地搜索像素,所以我开始想问你们。 我正在用RGB颜色搜索像素。 这是我的源代码: final int rot = 0; final int gruen = 0; final int blau = 0; int toleranz = 1; Color pixelFarbe; Dimension bildschirm = Toolkit.getDefaultToolkit().getScreenSize(); Robot roboter = null; try { roboter = new Robot(); } catch (AWTException e) { e.printStackTrace(); OrbitRaider.log(“Robot is not working.”); } for(int x […]

Java优化

我想知道是否有任何性能差异 String s = someObject.toString(); 的System.out.println(一个或多个); 和 的System.out.println(someObject.toString()); 看看生成的字节码,它似乎有差异。 JVM是否能够在运行时优化此字节码以使两种解决方案都提供相同的性能? 在这个简单的情况下,当然解决方案2似乎更合适,但有时我更倾向于解决方案1以实现可读性,我只想确保不会在关键代码部分中引入性能“降低”。