我想计算我的Java程序的执行时间,我很困惑我应该怎么做.我知道可以使用System.nanoTime()和System.currentTimeInMillis()计算经过的时间,但是这种方法没有考虑操作系统的基础调度机制.
例如:假设有3个进程同时运行(假设它是一个单核心系统)
过程A.
进程B(我的Java代码 - 在JVM进程中运行)
过程C.
现在,如果进程B在上午11:00开始执行并在上午11:02完成执行,则System.nanoTime()和System.currentTimeInMillis()将报告所花费的时间为2分钟.但是,过程B可能不会在整个2分钟的持续时间内运行,因为操作系统将安排另外2个进程,并且它们将在2分钟的时间间隔内运行一段时间.所以本质上java程序运行不到2分钟.
有没有办法确定Java程序本身完成执行所花费的确切时间?注意 :
我们可以多次运行代码并花费平均时间来最小化这种情况的影响,仍然很高兴知道是否有一些可靠的方法来计算执行时间
让我们假设我们需要时间的代码部分不能分解成更小的块并且需要花费大量时间来处理.
我刚刚构建并设置了一个应用了RT补丁的vanilla Linux内核.一切都很顺利,我现在可以正确启动进入新内核.
令我疑惑的是:我有一个我在C中制作的模拟器程序,我希望它以硬实时模式执行,新内核应该允许它.可能整个模拟器不需要以实时优先级运行,但内部的一些任务可以.
我怎么能做到这一点?我认为只是运行该程序是行不通的.
今天我在java中遇到了一个相当惊人的行为,or比它慢and!
我甚至做了一个你可以在下面看到的测试用例.现在我想知道为什么会这样?我做错了什么或者只是在我的电脑上发生了什么?我没有看到任何理由or应该比and这个显着差异特别慢.我想用其他一些语言测试这种现象,你对这个一般有什么想法吗?
public class TestClass {
public static void main(String[] args) {
long[] or = new long[10];
long[] and = new long[10];
long lStartTime, lEndTime, difference = 0;
for (int idx = 0; idx < 10; idx++) {
lStartTime = System.nanoTime();
for (int i= 0; i < 1000000000; i++) {
int j = i | i+1 ;
}
lEndTime = System.nanoTime();
difference = lEndTime - lStartTime;
System.out.println("Elapsed milliseconds: " + difference/1000000);
or[idx] …Run Code Online (Sandbox Code Playgroud) 我不喜欢打电话的想法hasNext()和next(),看到我是多么需要一个循环,反正调用这些,我真的不觉得用在列表和地图给我们的迭代多点.
是否只需要从列表中提取一个?或者,如果您从列表中选择一个项目,并且必须在不可测量的时间内执行此操作?我在Google或Stack上找不到这个,请帮帮我.
我不是专门讨论增强的for循环(for-each循环).
我也理解foreach循环在性能方面表现优异,但这更像是"为什么存在"的问题
编辑:已实现我只谈论集合而不是数组aswel.Foreach循环在这种情况下没有限制.
我已经阅读了如何计算方法在Java中的执行时间?并了解定时执行方法的常用可能性(启动/停止计时器执行,使用方面等).
我想知道Java 8的新方法引用和lambdas是否为实现以下目标带来了任何帮助.
普通代码:
String r;
r = methodCall("foo","bar");
Run Code Online (Sandbox Code Playgroud)
在性能调优期间,将代码修改为类似的内容,以测量执行方法所花费的时间
String r;
time(() -> {
r = methodCall("foo", "bar"); // doesn't work as r needs to be effectively final
});
Run Code Online (Sandbox Code Playgroud)
我明白我能做到
String r;
r = time1(() ->
methodCall("foo", "bar)
);
Run Code Online (Sandbox Code Playgroud)
(注意结尾处缺少的分号),使用类似的time1方法
public static <R> R time1(Supplier<R> s){
long start = System.currentTimeMillis();
R result = s.get();
System.out.println("Execution took " + (System.currentTimeMillis() - start));
return result;
}
Run Code Online (Sandbox Code Playgroud)
或者我能做到
r = time2(this::methodCall, "foo", "bar");
Run Code Online (Sandbox Code Playgroud)
用time2方法就好
public static <A,B,R> R time2(BiFunction<A, B, …Run Code Online (Sandbox Code Playgroud) Java中哪一个更快?
一个. for(int i = 100000; i > 0; i--) {}
湾 for(int i = 1; i < 100001; i++) {}
Java中哪一个更快?
一个. Math.max(a,b);
湾 (a>b)?a:b
我有一些代码在数组中生成1000个数字然后对它们进行排序:
import java.util.Arrays;
import java.util.Random;
public class OppgA {
public static void main(String[] args) {
int[] anArray;
anArray = new int[1000];
Random generator = new Random();
for(int i=0; i<1000; i++){
anArray[i] = (generator.nextInt(1000)+1);
}
Arrays.sort(anArray);
System.out.println(Arrays.toString(anArray));
}
}
Run Code Online (Sandbox Code Playgroud)
现在我被要求计算并打印排序数组所花费的时间.我有什么线索可以做到这一点?我真的找不到太多可以帮助我解决的问题.
谢谢!
我想要我的应用程序的持续时间/运行时间(以毫秒为单位)。那可能吗?
我已经试过了:
long timestamp = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)
但这就是当前时间与UTC 1970年1月1日午夜之间的差异(以毫秒为单位)。
但是自从我的Android应用程序运行以来,我需要几毫秒的时间。例如:
我使用时的性能list.parallelStream()比使用时差得多list.stream()。您认为为什么会发生这种情况?顺便说一句,这是Java 17,我的CPU 是桌面级的 i5。
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Period;
import java.time.chrono.ChronoPeriod;
import java.time.chrono.HijrahChronology;
import java.time.chrono.HijrahDate;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class App {
public static void main(String[] args) throws Exception {
int size = 1;
List<Integer> list = null;
long startTimeN;
long endTimeN;
long startTimeP;
long endTimeP;
long normalStreamCheckedSize;
long normalStreamTime;
long parallelStreamCheckedSize;
long parallelStreamTime; …Run Code Online (Sandbox Code Playgroud)