使用日期和&&时的性能问题

用户名

在评估某些非常特殊的条件时,我正在遇到一些非常奇怪的性能行为。

基本上,我发现我可以构建两个条件a和b是if(a)比快10倍,if(a && b)即使a是始终为假,这似乎直接与事实的Java应该做的条件懒评价发生冲突。

当我有发生的情况下asomeDate.after(startdate)bsomeDate.before(enddate)即一个相当标准的范围条件- 。

在下面,我附加了用于显示此特定问题的代码。我已经在带有Java 7的Windows 7上运行了该代码,而我的一位同事已经在带有Java 6,7和8的Windows 7上运行了这些代码-都具有相同的结果。

谁能解释为什么会这样?

import java.util.Date;

public class DateWeirdness {
public static void main(String[] args) {
    Date start = new Date();
    System.out.println("if(a) - a always false");
    System.out.println(timeBasic(2000000000, start, start.getTime() - 4000000000L));
    start = new Date();
    System.out.println("if(a && b) - a always false, a and b both date method");
    System.out.println(timeAdv(2000000000, start, start.getTime() - 4000000000L, new Date()));
    start = new Date();
    System.out.println("if(a && b) - a always false, b is condition on longs not date");
    System.out.println(timeAdv2(2000000000, start, start.getTime() - 4000000000L, new Date().getTime()));
    start = new Date();
    System.out.println("if(a) - a always false - condition on long");
    System.out.println(timeBasicL(2000000000, start.getTime(), start.getTime() - 4000000000L));
    start = new Date();
    System.out.println("if(a && b) - a always false, a and and b both conditions on long");
    System.out.println(timeAdvL(2000000000, start.getTime(), start.getTime() - 4000000000L, new Date().getTime()));
    start = new Date();
    System.out.println("if(a && b) - a always false, b always true");
    System.out.println(timeAdv(2000000000, start, start.getTime() - 4000000000L, new Date()));
    start = new Date();
    System.out.println("if(a && b) - both true");
    System.out.println(timeAdv(2000000000, start, start.getTime() + 1, new Date(start.getTime() + 4000000000L)));
    start = new Date();
    System.out.println("if(a && b) - a always true, b always false");
    System.out.println(timeAdv(2000000000, start, new Date(start.getTime() + 4000000001L).getTime(), new Date(start.getTime() + 4000000000L)));
}

private static int timeBasic(int size, Date start, long l) {
    long begin = System.currentTimeMillis();
    int c = 0;
    for (int i = 0; i < size; i++) {
        Date date = new Date(l++);
        if (start.before(date)) {
            c++;
        }
    }
    System.out.println(System.currentTimeMillis() - begin);
    return c;
}

private static int timeAdv(int size, Date start, long l, Date end) {
    long begin = System.currentTimeMillis();
    int c = 0;
    for (int i = 0; i < size; i++) {
        Date date = new Date(l++);
        if (start.before(date) && end.after(date)) {
            c++;
        }
    }
    System.out.println(System.currentTimeMillis() - begin);
    return c;
}

private static int timeAdv2(int size, Date start, long l, long end) {
    long begin = System.currentTimeMillis();
    int c = 0;
    for (int i = 0; i < size; i++) {
        Date date = new Date(l++);
        if (start.before(date) && end > l) {
            c++;
        }
    }
    System.out.println(System.currentTimeMillis() - begin);
    return c;
}

private static int timeBasicL(int size, long start, long l) {
    long begin = System.currentTimeMillis();
    int c = 0;
    for (int i = 0; i < size; i++) {
        l++;
        if (start < l) {
            c++;
        }
    }
    System.out.println(System.currentTimeMillis() - begin);
    return c;
}

private static int timeAdvL(int size, long start, long l, long end) {
    long begin = System.currentTimeMillis();
    int c = 0;
    for (int i = 0; i < size; i++) {
        l++;
        if (start < l && end > l) {
            c++;
        }
    }
    System.out.println(System.currentTimeMillis() - begin);
    return c;
}
}

在本地运行时,我得到以下输出。有趣的测试是前三个测试。640是执行的毫秒数if(a)7079是执行的性能if(a && b),其中ab如上所述。710是这样做的性能if(a && b)哪里bsomeDateAsLong < endDateAsLong

if(a) - a always false
640
0
if(a && b) - a always false, a and b both date method
7079
0
if(a && b) - a always false, b is condition on longs not date
710
0
if(a) - a always false - condition on long
639
0
if(a && b) - a always false, a and and b both conditions on long
708
0
if(a && b) - a always false, b always true
6873
0
if(a && b) - both true
11995
2000000000
if(a && b) - a always true, b always false
13746
0

JVM以一种start.before(date)根本不评估的方式优化代码(我认为)。尝试将其运行-Djava.compiler=NONE并查看结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

解析日期时的性能问题

来自分类Dev

Highcharts - 使用带有 x 值日期和时间的图表的性能问题

来自分类Dev

使用 WHERE EXISTS 条件时的性能问题

来自分类Dev

熊猫的性能问题和日期时间列过滤

来自分类Dev

OrientDB 一起使用 MATCH 和 SELECT 时的查询性能问题

来自分类Dev

使用新日期()Android时的日期问题

来自分类Dev

使用Django queryset出现查询日期对象的性能问题

来自分类Dev

使用jbcrypt时的可变性能和降级性能

来自分类Dev

使用类和实例时的Haskell性能

来自分类Dev

创建文件校验和时的性能问题

来自分类Dev

获取当年开始日期和结束日期时的问题

来自分类Dev

使用功能性方法查找最小值和最大值时的性能问题

来自分类Dev

尝试使用Date()和moment.js获取正确的日期时出现问题

来自分类Dev

使用Objective-C将时间戳解析为日期和时间时出现的问题

来自分类Dev

使用setMonth时的Javascript日期问题

来自分类Dev

使用功能时如何改善eXSLT性能问题

来自分类Dev

使用apache Beam从GCS读取文件时遇到性能问题

来自分类Dev

在类中使用随机生成器时的性能问题

来自分类Dev

使用Gmail API列出线程时的性能问题

来自分类Dev

在SELECT语句中使用参数时的性能问题

来自分类Dev

使用功能时如何改善eXSLT性能问题

来自分类Dev

使用调用模板参数时的 Xalan 性能问题

来自分类Dev

使用实体框架6的初始负载和性能问题

来自分类Dev

使用spark-sql GROUP BY解决性能和内存问题

来自分类Dev

使用Dapper和Oracle的奇怪的SQL性能问题

来自分类Dev

使用选择,计数和分组依据的MySQL性能问题

来自分类Dev

使用istringstream的性能问题

来自分类Dev

使用 UNION 的性能问题

来自分类Dev

使用AngularJS和MomentJS的日期处理问题/问题

Related 相关文章

  1. 1

    解析日期时的性能问题

  2. 2

    Highcharts - 使用带有 x 值日期和时间的图表的性能问题

  3. 3

    使用 WHERE EXISTS 条件时的性能问题

  4. 4

    熊猫的性能问题和日期时间列过滤

  5. 5

    OrientDB 一起使用 MATCH 和 SELECT 时的查询性能问题

  6. 6

    使用新日期()Android时的日期问题

  7. 7

    使用Django queryset出现查询日期对象的性能问题

  8. 8

    使用jbcrypt时的可变性能和降级性能

  9. 9

    使用类和实例时的Haskell性能

  10. 10

    创建文件校验和时的性能问题

  11. 11

    获取当年开始日期和结束日期时的问题

  12. 12

    使用功能性方法查找最小值和最大值时的性能问题

  13. 13

    尝试使用Date()和moment.js获取正确的日期时出现问题

  14. 14

    使用Objective-C将时间戳解析为日期和时间时出现的问题

  15. 15

    使用setMonth时的Javascript日期问题

  16. 16

    使用功能时如何改善eXSLT性能问题

  17. 17

    使用apache Beam从GCS读取文件时遇到性能问题

  18. 18

    在类中使用随机生成器时的性能问题

  19. 19

    使用Gmail API列出线程时的性能问题

  20. 20

    在SELECT语句中使用参数时的性能问题

  21. 21

    使用功能时如何改善eXSLT性能问题

  22. 22

    使用调用模板参数时的 Xalan 性能问题

  23. 23

    使用实体框架6的初始负载和性能问题

  24. 24

    使用spark-sql GROUP BY解决性能和内存问题

  25. 25

    使用Dapper和Oracle的奇怪的SQL性能问题

  26. 26

    使用选择,计数和分组依据的MySQL性能问题

  27. 27

    使用istringstream的性能问题

  28. 28

    使用 UNION 的性能问题

  29. 29

    使用AngularJS和MomentJS的日期处理问题/问题

热门标签

归档