我需要捕获迭代中某些代码的执行时间.我决定使用a Map<Integer,Long>来捕获这些数据,其中Integer(key)是迭代次数,Long(value)是该迭代所消耗的时间(以毫秒为单位).
我编写了下面的java代码来计算每次迭代所花费的时间.我想确保在调用实际代码之前所有迭代所花费的时间都为零.令人惊讶的是,下面的代码对于每次执行都表现不同.
有时候,我得到了所需的输出(所有迭代都是零毫秒),但有时候我会得到一些随机迭代的正值甚至是负值.
我尝试用System.currentTimeMillis();以下代码替换:
new java.util.Date().getTime();
System.nanoTime();
org.apache.commons.lang.time.StopWatch
但仍然没有运气.
任何建议为什么一些迭代需要额外的时间以及如何消除它?
package com.stackoverflow.programmer;
import java.util.HashMap;
import java.util.Map;
public class TestTimeConsumption {
public static void main(String[] args) {
Integer totalIterations = 100000;
Integer nonZeroMilliSecondsCounter = 0;
Map<Integer, Long> timeTakenMap = new HashMap<>();
for (Integer iteration = 1; iteration <= totalIterations; iteration++) {
timeTakenMap.put(iteration, getTimeConsumed(iteration));
if (timeTakenMap.get(iteration) != 0) {
nonZeroMilliSecondsCounter++;
System.out.format("Iteration %6d has taken %d millisecond(s).\n", iteration,
timeTakenMap.get(iteration));
}
}
System.out.format("Total non zero entries : %d", nonZeroMilliSecondsCounter);
}
private static Long getTimeConsumed(Integer iteration) {
long startTime = System.currentTimeMillis();
// Execute code for which execution time needs to be captured
long endTime = System.currentTimeMillis();
return (endTime - startTime);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是来自同一代码的5种不同执行的示例输出:
执行#1(不行)
Iteration 42970 has taken 1 millisecond(s).
Total non zero entries : 1
Run Code Online (Sandbox Code Playgroud)
执行#2(好的)
Total non zero entries : 0
Run Code Online (Sandbox Code Playgroud)
执行#3(好的)
Total non zero entries : 0
Run Code Online (Sandbox Code Playgroud)
执行#4(不行)
Iteration 65769 has taken -1 millisecond(s).
Total non zero entries : 1
Run Code Online (Sandbox Code Playgroud)
执行#5(不行)
Iteration 424 has taken 1 millisecond(s).
Iteration 33053 has taken 1 millisecond(s).
Iteration 76755 has taken -1 millisecond(s).
Total non zero entries : 3
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种基于Java的解决方案,确保所有迭代始终如一地消耗零毫秒.我更喜欢使用纯Java代码而不使用分析器来实现此目的.
注意:我也可以通过C代码完成此任务.
你的暗示是对的......System.currentTimeMillis(); 这就是这种情况下要走的路。
不能保证增加整数对象 i 的值在任何系统中都代表毫秒或周期时间......
您应该采用 System.currentTimeMillis()并计算经过的时间
public static void main(String[] args) {
long lapsedTime = System.currentTimeMillis();
doFoo();
lapsedTime -= System.currentTimeMillis();
System.out.println("Time:" + -lapsedTime);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |