Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中测量一个线程从新线程到结束所需的时间_Java_Java Threads - Fatal编程技术网

如何在java中测量一个线程从新线程到结束所需的时间

如何在java中测量一个线程从新线程到结束所需的时间,java,java-threads,Java,Java Threads,问题: public void process2(){ final long start = System.currentTimeMillis(); Thread newT = new Thread(new Runnable() { @Override public void run() { // long end = System.currentTimeMillis(); // System.out

问题:

public void process2(){
    final long start = System.currentTimeMillis();
    Thread newT = new Thread(new Runnable() {
        @Override
        public void run() {
            // long end = System.currentTimeMillis();
            // System.out.println((end-start));

            for (int i = 1, sum = 0; i < 1000; i++) {
                sum += i;
            }
        }
    });
    long end1 = System.currentTimeMillis();
    System.out.println("new thread time took :" + (end1 - start));
    newT.start();

    int i = 0;
    while (newT.isAlive()) {
        i++;
    }

    long end = System.currentTimeMillis();
    System.out.println("total time:" + (end - start));
    System.out.println("judge count:" + i);

}
  • 有没有办法得到一个线程从新到结束的确切时间
  • 为什么每次的结果都有巨大的差异(见下面的代码)
  • 代码:

    public void process2(){
        final long start = System.currentTimeMillis();
        Thread newT = new Thread(new Runnable() {
            @Override
            public void run() {
                // long end = System.currentTimeMillis();
                // System.out.println((end-start));
    
                for (int i = 1, sum = 0; i < 1000; i++) {
                    sum += i;
                }
            }
        });
        long end1 = System.currentTimeMillis();
        System.out.println("new thread time took :" + (end1 - start));
        newT.start();
    
        int i = 0;
        while (newT.isAlive()) {
            i++;
        }
    
        long end = System.currentTimeMillis();
        System.out.println("total time:" + (end - start));
        System.out.println("judge count:" + i);
    
    }
    
    public void process2(){
    最终长启动=System.currentTimeMillis();
    线程newT=新线程(新可运行(){
    @凌驾
    公开募捐{
    //long end=System.currentTimeMillis();
    //System.out.println((结束-开始));
    对于(int i=1,sum=0;i<1000;i++){
    总和+=i;
    }
    }
    });
    long-end1=System.currentTimeMillis();
    println(“新线程花费的时间:”+(end1-start));
    newT.start();
    int i=0;
    while(newT.isAlive()){
    i++;
    }
    long end=System.currentTimeMillis();
    System.out.println(“总时间:+(结束-开始));
    System.out.println(“判断计数:+i”);
    }
    
  • 测量执行时间通常更为相关,即执行
    run()
    方法所花费的时间。这段时间在不同的运行之间通常是相似的

  • 在一个新的
    线程
    对象上的创建成本相当高,并且取决于系统当前可用的资源,这就是为什么
    线程
    创建和执行之间的时间会有很大差异的原因。更重要的是,在销毁线程之前,有一个清理过程也可能占用大量时间


  • 优化线程管理时间(创建/销毁)的一种方法是使用
    ThreadPool
    ExecutorService
    。有关更多详细信息,请参见Oracle。

    您为测量编造了一个非常糟糕的示例

    首先,用new创建一个新线程非常便宜(这是一个普通的java对象)。但您实际上包括了匿名Runnable的类加载时间。这将涉及I/O,因此预计执行时间会有很大变化,特别是在第一次运行时

    然后,以毫秒为单位测量时间。但是系统时间不一定有实际的毫秒分辨率(请阅读system.currentTimeMillis的javadocs)。此外,您试图测量的内容在大多数情况下都会在不到一毫秒的时间内执行

    您的Runnable没有明显的副作用,因此JIT可能会在短暂的预热后优化整个代码。运行几次之后,runnable实际上可能根本不需要任何时间

    您正在轮询以确定其他线程何时结束。这使得CPU(如果有多个CPU,则为一个内核)忙着不做任何有用的事情。对于单核机器来说,这意味着平均有50%的时间是用来检查线程是否处于活动状态的。根据操作系统调度程序运行线程的方式,这是另一个变化源


    总而言之,您已经创建了一个微基准,并且您已经涉足了微基准在java中可能遇到的所有最常见的陷阱。java中的基准测试需要一定的谨慎,否则您将度量任何东西,而不是您真正想要度量的代码的性能。这里有基准测试框架,也有关于如何正确使用java进行基准测试的优秀文章,以及大量相关问题。利用这些资源。

    尝试谷歌搜索“上下文切换”和“软件线程”您也在测量主线程时间,而不断检查is live的While循环会窃取CPU周期,您可以使用joindeep分析,谢谢