我正在尝试计算我的算法性能。基本上,我的算法解决了集合运算,例如联合、析取、交集等。我的算法可以在 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/