下面的代码运行完全相同的计算3次(它没有做太多:基本上添加从1到100米的所有数字).前两个块的运行速度比第三个块快约10倍.我已经运行了这个测试程序超过10次,结果显示非常小的差异.
如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是:
35974537
36368455
296471550
有人能解释一下发生了什么吗?(为了清楚起见,我不是想在这里修改任何东西,只是想更好地了解发生了什么)
注意:
-XX:+PrintGC)-XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m=>相同的结果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.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?
我刚刚开始学习JavaFX 2.
现在我正在尝试构建一个示例应用程序.然后我被困在组合框中.
我没有在JavaFX中找到对combobox的键值对的任何引用.http://docs.oracle.com/javafx/2/api/index.html上
的组合框javadoc 没有说明关键值对.
如何创建具有不同显示值和实际值的项目的组合框?
我有以下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.不应该被丢弃吗?
我应该怎么做才能调查和解决慢速编译问题?
我的项目有大约100个类,编译时间超过45秒,这对我来说似乎很慢.作为参考,我有另外一个项目有50个类,在3秒内编译.
PS:
mvn clean compile),其中45秒用于运行javac(通过运行-X选项确认).-Xms500m)感谢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方法被注释掉,则编译时间恢复正常.
警告:问题有点长,但分离线下方的部分仅用于好奇.
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 …
我们说我有以下课程:
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)
有没有解决这个问题的方法所以我可以保留通用功能,而不需要转换?除了使我的集合所有基本类型集合,动物在这个例子的情况下?
令我感到困惑的是,我们可以允许将JTA事务与非XA数据源一起使用.链接到文档.那么XA /非XA数据源之间有什么区别?我们为什么要使用XA数据源呢?
我需要从字符串中解析持续时间.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 ×9
performance ×3
java-8 ×2
java-time ×2
jvm ×2
collections ×1
compilation ×1
datasource ×1
generics ×1
javac ×1
javafx-2 ×1
jboss ×1
jit ×1
jta ×1
netbeans ×1
netbeans-8 ×1
regex ×1
xa ×1