小编ass*_*ias的帖子

性能说明:预热后代码运行速度较慢

下面的代码运行完全相同的计算3次(它没有做太多:基本上添加从1到100米的所有数字).前两个块的运行速度比第三个块快约10倍.我已经运行了这个测试程序超过10次,结果显示非常小的差异.

如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是:

35974537
36368455
296471550

有人能解释一下发生了什么吗?(为了清楚起见,我不是想在这里修改任何东西,只是想更好地了解发生了什么)

注意:

  • 程序期间没有GC运行(监控-XX:+PrintGC)
  • 使用Oracle JDK版本1.6.0_30,1.7.0_02和1.7.0_05进行测试
  • 还测试了以下参数:-XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m=>相同的结果
  • 它将块放入循环中,所有运行都很快
  • 如果将块提取到方法,则所有运行都很快(无论方法被调用3次还是循环都没有区别)
public static void main(String... args) {
    //three identical blocks
    {
        long start = System.nanoTime();
        CountByOne c = new CountByOne();
        int sum = 0;
        for (int i = 0; i < 100000000; i++) {
            sum += c.getNext();
        }
        if (sum != c.getSum()) throw new IllegalStateException(); //use sum
        long end = System.nanoTime();
        System.out.println((end - start));
    }
    {
        long start = System.nanoTime();
        CountByOne …
Run Code Online (Sandbox Code Playgroud)

java performance jit jvm

19
推荐指数
1
解决办法
728
查看次数

Java 8 - 将LocalDate转换为ZonedDateTime

我是java.time包的新手.我有一个LocalDate 2015-12-10.我需要将其转换为ZonedDateTime.时间应为00:00:00,区域为ZoneOffset.UTC.

转换后,ZonedDateTime应为2015-12-10T00:00:00 + 02:00.

我将LocalDate存储在名为startDate的变量中.

我试过了:

ZonedDateTime.ofInstant(Instant.from(startDate), ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)

但得到错误

java.time.DateTimeException:无法从TemporalAccessor获取Instant:2015-12-10,类型为java.time.LocalDate]

我也尝试过:

startDate.atStartOfDay().atZone(ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)

这给出了意外的结果.

我查看了API并尝试了其他一些方法,但到目前为止还没有运气.

有没有其他方法可以将LocalDate转换为ZonedDateTime?

java java-8 java-time

19
推荐指数
1
解决办法
2万
查看次数

JavaFX 2中的组合框键值对

我刚刚开始学习JavaFX 2.
现在我正在尝试构建一个示例应用程序.然后我被困在组合框中.
我没有在JavaFX中找到对combobox的键值对的任何引用.http://docs.oracle.com/javafx/2/api/index.html
的组合框javadoc 没有说明关键值对.

如何创建具有不同显示值和实际值的项目的组合框?

java javafx-2

18
推荐指数
2
解决办法
3万
查看次数

Java RegEx负面的lookbehind

我有以下Java代码:

Pattern pat = Pattern.compile("(?<!function )\\w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());
Run Code Online (Sandbox Code Playgroud)

为什么mat.find()回归真实?我使用了负面的lookbehind,example之前是function.不应该被丢弃吗?

java regex regex-lookarounds

18
推荐指数
1
解决办法
2万
查看次数

对慢速编译进行故障排除

我应该怎么做才能调查和解决慢速编译问题

我的项目有大约100个类,编译时间超过45秒,这对我来说似乎很慢.作为参考,我有另外一个项目有50个类,在3秒内编译.

PS:

  • 我使用maven作为构建工具.编译需要大约50秒(mvn clean compile),其中45秒用于运行javac(通过运行-X选项确认).
  • 增加内存量没有帮助(-Xms500m)
  • 我可以提供有关我的项目的更多信息,但它是相当标准的,所以我不确定哪些信息是相关的.

UPDATE

感谢Tagir的想法,我找到了其中一个罪魁祸首.该类为编译时间增加了20秒:

import org.jooq.DSLContext;
import org.jooq.Field;
import static org.jooq.impl.DSL.field;
import static org.jooq.impl.DSL.round;
import static org.jooq.impl.DSL.sum;


class Test {
  static Object fast(DSLContext sql) {
    Field<Double> a = field("a").cast(Double.class);
    return sql.select()
            .having(round(sum(a).cast(Double.class), 2).ne(0d));
  }
  static Object slow(DSLContext sql) {
    return sql.select()
            .having(round(sum(field("a").cast(Double.class)).cast(Double.class), 2).ne(0d));
  }
}
Run Code Online (Sandbox Code Playgroud)

如果slow方法被注释掉,则编译时间恢复正常.

java performance compilation javac

18
推荐指数
2
解决办法
7091
查看次数

AtomicInteger实现和代码重复

警告:问题有点长,但分离线下方的部分仅用于好奇.

Oracle的AtomicInteger的JDK 7实现包括以下方法:

public final int addAndGet(int delta) {
    for (;;) {
        int current = get();
        int next = current + delta;         // Only difference
        if (compareAndSet(current, next))
            return next;
    }
}

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;             // Only difference
        if (compareAndSet(current, next))
            return next;
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显第二种方法可以写成:

public final int incrementAndGet() {
    return addAndGet(1);
}
Run Code Online (Sandbox Code Playgroud)

在该类中还有其他几个类似代码重复的例子.我想不出有任何理由这样做,而是考虑性能(*).我很确定作者在确定设计之前做了一些深入的测试.

为什么(或在什么情况下)第一个代码比第二个代码表现更好?


(*)我无法抗拒,但写了一个快速的微基准.它显示(后JIT)系统性差距为2-4%,有利于addAndGet(1)vs incrementAndGet()(虽然很小,但它非常一致).说实话,我无法真正解释这个结果......

输出:

incrementAndGet():905 …

java performance jvm

17
推荐指数
2
解决办法
3629
查看次数

添加到传递给方法的通用集

我们说我有以下课程:

  • 动物

Animal是基类,cat,dog和cow的每个子类.

我现在有一个Set<Cat>,Set<Dog>并且Set<Cow>每个都以相同的方式使用,因此有必要制作一个通用函数来对它们进行操作:

private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals)
Run Code Online (Sandbox Code Playgroud)

这很好用,我可以自由地传递我的套装没有问题.

出现问题:我无法尝试将Animal toAdd添加到参数val.谷歌搜索显示,如果我改变方法阅读:

private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals)
Run Code Online (Sandbox Code Playgroud)

我将能够将Animal添加到参数val.这是有效的,除了现在,我不能通过我的子集我的猫,狗和奶牛.进一步的研究告诉我,以下工作,没有警告启动:

private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals)
Run Code Online (Sandbox Code Playgroud)

问题是,我需要能够执行Animal所有的方法调用.使用简单的强制转换很容易解决这个问题:

((Animal)toAdd).getAnimalType()
Run Code Online (Sandbox Code Playgroud)

有没有解决这个问题的方法所以我可以保留通用功能,而不需要转换?除了使我的集合所有基本类型集合,动物在这个例子的情况下?

java generics collections

17
推荐指数
1
解决办法
161
查看次数

删除缩进引导线

Netbeans 8默认显示缩进引导线(浅灰色虚线垂直线).如何关闭该功能?

在此输入图像描述

netbeans netbeans-8

17
推荐指数
1
解决办法
8719
查看次数

nonXADatasource与jta ="true"和XADataSource有什么区别?

令我感到困惑的是,我们可以允许将JTA事务与非XA数据源一起使用.链接到文档.那么XA /非XA数据源之间有什么区别?我们为什么要使用XA数据源呢?

java jboss datasource jta xa

17
推荐指数
2
解决办法
3万
查看次数

java.time.Duration中的错误

我需要从字符串中解析持续时间.Java 8提供了一种以ISO-8601标准为基础的方法:

Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour
Run Code Online (Sandbox Code Playgroud)

由于标准规定"允许通过共同协议省略'T'字符",持续时间的一些Javadoc示例中的一些例子都没有T.据他们说,以下表达式应解析为"-6小时+3分钟":

"P-6H3M"
Run Code Online (Sandbox Code Playgroud)

但是我发现所有的表达都省略了T抛出a DateTimeParseException.这是方法中的错误parse()还是我遗漏了什么?

java java-8 java-time

17
推荐指数
2
解决办法
1720
查看次数