java - 试图计算运行时间的进程在 0 纳秒内执行。如何?

标签 java performance time time-complexity

我正在尝试计算我的算法性能。基本上,我的算法解决了集合运算,例如联合、析取、交集等。我的算法可以在 O(logn) 中完成这些运算,以便与我实现原始解决方案的类似算法进行比较,blooms filter algorithm ,排序列表,但是当我尝试计算运行时间时,我看到其他算法中的一些操作实际上需要 0(零)纳秒才能完成。通过该操作,我的意思是找到两个集合的并集,每个集合中都有 10000 个元素。这怎么可能?你可以在 Github 上看到我的项目. 我计算运行时间的部分在测试包中

我尝试使用 Jprofilier 来确保它都在一个线程上运行

我尝试在时间间隔之间进行调试,以确保它不会忽略计算并找到正确的结果

static Duration IntersectDocumentsTime(AlgorithmInterface algorithm)
{
        Instant start = Instant.now(); // Time before calulation i tryed to put breakpoint here
        algorithm.IntersectDocuments(); // returns Term[] result of elements after union operation
        Instant end = Instant.now(); // Time after calulation
        return Duration.between(start,end); // i put a breakpoint here to see if IntersectDocuments() result is correct and actually calculated
}

这是我打印结果的方式

for (AlgorithmInterface al: Algorithms)
        {
            System.out.println("------------------------------------------------------------------------------");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Union\nTime: "
                    +OperationsInterface.AddDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Disjuction\nTime: "
                    +OperationsInterface.DisjointDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Intersection\nTime: "
                    +OperationsInterface.IntersectDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Subtraction\nTime: "
                    +OperationsInterface.SubtractDocumentsTime(al).toNanos()+"\tseconds");
            System.out.println("Algorithm: "+al.getClass().toString()+"\tOperation: Find\nTime: "
                    +OperationsInterface.ContainsTermTime(al,new Term("A")).toNanos()+"\tseconds");
        }
System.out.println("------------------------------------------------------------------------------");

结果是这样的


Algorithm: class Algorithms.FNA.FNA Operation: Union Time: 1851133600 seconds Algorithm: class Algorithms.FNA.FNA Operation: Disjuction Time: 1799607700 seconds Algorithm: class Algorithms.FNA.FNA Operation: Intersection Time: 291703600 seconds Algorithm: class Algorithms.FNA.FNA Operation: Subtraction Time: 1022775100 seconds Algorithm: class Algorithms.FNA.FNA Operation: Find Time: 1319100 seconds


Algorithm: class Algorithms.Primitive.Primitive Operation: Union Time: 81257800 seconds Algorithm: class Algorithms.Primitive.Primitive Operation: Disjuction Time: 85717600 seconds Algorithm: class Algorithms.Primitive.Primitive Operation: Intersection Time: 0 seconds Algorithm: class Algorithms.Primitive.Primitive Operation: Subtraction Time: 66472900 seconds Algorithm: class Algorithms.Primitive.Primitive Operation: Find Time: 0 seconds


Algorithm: class Algorithms.BloomsFilter.BloomsFilter Operation: Union Time: 998900 seconds Algorithm: class Algorithms.BloomsFilter.BloomsFilter Operation: Disjuction Time: 0 seconds Algorithm: class Algorithms.BloomsFilter.BloomsFilter Operation: Intersection Time: 503800 seconds Algorithm: class Algorithms.BloomsFilter.BloomsFilter Operation: Subtraction Time: 0 seconds Algorithm: class Algorithms.BloomsFilter.BloomsFilter Operation: Find Time: 1312900 seconds


Algorithm: class Algorithms.SortedList.SortedList Operation: Union Time: 0 seconds Algorithm: class Algorithms.SortedList.SortedList Operation: Disjuction Time: 3721800 seconds Algorithm: class Algorithms.SortedList.SortedList Operation: Intersection Time: 0 seconds Algorithm: class Algorithms.SortedList.SortedList Operation: Subtraction Time: 810500 seconds Algorithm: class Algorithms.SortedList.SortedList Operation: Find Time: 1173200 seconds


最佳答案

不要自己写微基准,使用JMH框架。这将确保您避免常见的陷阱,例如分层编译。

在您的代码中:

Instant start = Instant.now(); 
algorithm.IntersectDocuments();
Instant end = Instant.now();
return Duration.between(start,end);

如果 algorithm.IntersectDocuments() 没有副作用,它可以被优化掉。

请注意 Instant.now() 在后台使用 System.currentTimeMillis() not suitable for calculating elapsed time .

关于java - 试图计算运行时间的进程在 0 纳秒内执行。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496093/

相关文章:

excel - CSV的最佳时间跨度(时差)格式

php - 如何将 Unix 时间戳转换为 hhmmss?

performance - Oracle ADF框架的优缺点以及与其他框架的比较

performance - 从并发编程(语言)中受益?

date - Flutter:国际时间

java - 有一个不需要整个文本作为训练数据的实体识别器分类器算法吗?

java - IDE自动生成的@override注解有什么用?

java - 如何提高使用JDBC导入数据库的性能?

java - 使用 BufferedWriter 写入 TXT 文件 - Java

Java API 源代码