Tag: 性能

对于小型数组,为什么Arrays.copyOf比System.arraycopy快2倍?

我最近玩了一些基准测试,发现了非常有趣的结果,我现在无法解释。 这是基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations = 10, time = 1, batchSize = 1000) @Measurement(iterations = 10, time = 1, batchSize = 1000) public class ArrayCopy { @Param({“1″,”5″,”10″,”100”, “1000”}) private int size; private int[] ar; @Setup public void setup() { ar = new int[size]; for (int i = 0; i < size; i++) { ar[i] […]

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会有所不同吗? 或者这是微观优化,不会影响任何事情? 请记住,我可能正在使用大型矩阵。我应该考虑重新设计整个程序吗?

Java中的马尔可夫模型决策过程

我正在用Java编写辅助学习算法。 我遇到了一个我可能解决的数学问题,但由于处理过程很重,我需要一个最佳解决方案。 话虽如此,如果有人知道一个非常棒的优化库,但语言是Java,因此需要加以考虑。 这个想法很简单: 对象将存储变量的组合,例如ABDC,ACDE,DE,AE。 组合的最大数量将取决于我可以在不减慢程序速度的情况下运行的数量,因此理论上可以说100。 决策过程将每次迭代生成一个随机变量。 如果生成的变量是其中一个组合的一部分,例如。 ‘A’是ABDC和ACDE的一部分,而不是C和B(或存储的组合中的任何后续字母)的倾向将增加。 为了使事情更加清晰,我们假设’A’,’B’,’C’,’D’和’E’是唯一可能的变量。 事实是,会有更多像12或14,但这个最大值还取决于我可以处理多少没有滞后。 由于有五个可能的变量,它将为第一次迭代生成加权1/5随机滚动。 如果该滚动结果为’A’,则比下一次迭代’B’和’C’现在将具有2/5倾向而不是1/5。 如果下一次迭代产生’B’,’D’倾向将增加到3/5。 注意:关系是指数关系; 实际上,它不会是1/5,而是像10%那样略微提升,如果它达到序列中的第4个变量,它将滚雪球说50%。 现在,在Java中,我可以通过跟踪每个对象的所有存储组合来实现此function。 我想通过在每次迭代中以小步骤分配跟踪过程,它不应该太慢。 另一种解决方案是绘制所有可能的组合及其潜在的倾向。 这当然只需要一个搜索function,但也会在计算所有可能性和存储在某个地方时出现问题,可能在文件中。 有人建议我应该使用马尔可夫模型和/或库,尽管我对这种类型的数学并不太熟悉。 如何在Java中快速计算此过程? 。 示例>>> 只有一个序列ABC。 对于三个数字,机会开始相等所以它看起来像兰特(1,3) 如果A是结果,我们增加B的可能性,因为它是序列中的下一个字母。 让我们说它加倍。 所以现在机会是:A = 1/4,C = 1/4,B = 2/4 该函数现在看起来像rand(1,4),其中3和4的结果都代表选项B. 如果下一个结果是B,我们希望增加C的可能性,因为它是序列中的下一个字符,但是它是上次增加的两倍(指数) 机会现在是这样的:A = 1/6,C = 1/6,B = 4/6 该函数现在为rand(1/6),其中值3,4,5,6表示C.

为什么本机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 […]

非常快速的均匀分布随机数发生器

作为蒙特卡罗模拟的一部分,我必须滚动一组骰子,直到某些值出现一定次数。 我执行此操作的代码调用一个骰子类,它生成1到6之间的随机数,并返回它。 最初的代码看起来像 public void roll() { value = (int)(Math.random()*6) + 1; } 它不是很快。 通过交换Math.random()来实现 ThreadLocalRandom.current().nextInt(1, 7); 它在原始时间的大约60%中运行了一个部分,大约有2.5亿次。 作为完整模拟的一部分,它至少会在数十亿次上调用这种方法,那么有没有更快的方法呢?

长GC在应用程序中暂停

我目前正在运行一个需要最大堆大小为16GB的应用程序。 目前我使用以下标志来处理垃圾收集。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=50, -XX\:+DisableExplicitGC, -XX\:+PrintGCDateStamps, -XX\:+PrintGCDetails, -Xloggc\:/home/user/logs/gc.log 但是,我注意到在一些垃圾收集期间,应用程序会锁定几秒钟然后继续 – 这是完全不可接受的,因为它是游戏服务器。 我的垃圾收集日志可以在这里找到。 关于我应该改变什么以减少这些长时间停顿的任何建议将不胜感激。

在Selenium中计时页面加载时间

我正在使用selenium在我的网站上记录一些性能测试。 例如登录时间,查询时间等。我在Selenium IDE上记录了一个示例脚本。 我现在让它运行一个Selenium RC(java)。 public void testNew() throws Exception { selenium.open(“/jira/secure/Dashboard.jspa”); selenium.selectFrame(“gadget-10371”); selenium.type(“login-form-username”, “username”); selenium.type(“login-form-password”, “pw”); selenium.click(“login”); selenium.waitForPageToLoad(“30000”); selenium.selectWindow(“null”); selenium.click(“find_link”); selenium.waitForPageToLoad(“30000”); selenium.removeSelection(“searcher-pid”, “label=All projects”); } 如何记录从单击登录按钮到加载“登录”屏幕的时间长度? 这是我想出的,这是一个准确的时机吗? : long starttime = System.currentTimeMillis(); selenium.waitForPageToLoad(“30000″); long stoptime = System.currentTimeMillis(); long logintime = stoptime – starttime; System.out.println(logintime+” ms” );

流filter的时间复杂度

我有这样的代码: List Listings = new ArrayList(); Listings.add(listing1); Listings.add(listing2); … … … Listing listing= listings.stream() .filter(l -> l.getVin() == 456) .findFirst(); 我的问题是过滤过程的时间复杂度是多少? 如果它是O(n),我的直觉是将它转换为HashSet,就像数据结构一样,这样时间复杂度可能变成O(1),是否有一种优雅的方式来实现流 ?

Spring的@Autowired是一个巨大的性能问题吗?

我有一个项目……我不知道…… 200-300 daos / services / controllers我使用@Autowired连接所有内容而不是在applicationContext.xml指定所有内容。 我的问题是,这对我的创业时间有多大影响? 是否值得删除所有@Autowired注释并实际通过applicationContext.xml手动连接此applicationContext.xml ? 从架构的角度来看,我喜欢@Autowired 。 我不想通过使用xml文件添加另一层复杂性 – 就我而言,它没有增加任何价值。 但是,如果这种事情为我的容器的加载时间增加10秒,我可能会考虑它。 如果成本是100毫秒,那么我会保持原样。 谢谢

对于这种算法,Python与Java相比非常慢

我正在研究算法,并决定将Java程序从教科书移植到Python,因为我不喜欢Java开销,特别是对于小程序,以及作为练习。 算法本身非常简单,它只是以阵风的方式从arrays中取出所有三元组,并计算有多少三元组总和为零(例如:[ – 2,7,-5]) public static int count(int[] a) { int N = a.length; int cnt = 0; for (int i = 0; i < N; i++) { for (int j = i+1; j < N; j++) { for (int k = j+1; k < N; k++) { if (a[i] + a[j] + a[k] == […]