如何衡量多线程应用程序中的代码性能?

时间:2018-06-11 04:08:59

标签: java multithreading performance

我目前正在开展一个项目,在这个项目中我没有使用任何性能测量工具来计算代码执行所需的时间。

相反,我在代码的开头和结尾使用long <variableName> = System.nanoTime();,并减去它们以获得完成执行所需的时间。

在我开始在多线程代码中使用它之前,它工作正常。

public class DataEntry {


    public static void main(String[] args) {

        long l = System.nanoTime();

        /*
        *  Regular Multithreading code to generate 'n' number of threads to
        *  perform a certain task.
        */


        System.out.println("Total Execution Time Is : "+((System.nanoTime()-l)/1000000.0)+" milli seconds");
    }
}

我面临的问题是我的main()线程在用户创建线程完成任务之前很久就完成了执行。

我的意思是,我得到这样的输出......

Total Execution Time Is : 9.600147 milli seconds
Thread#1 :  Execution Over Bye Bye
Thread#2 :  Execution Over Bye Bye
Thread#3 :  Execution Over Bye Bye
Thread#4 :  Execution Over Bye Bye
Thread#5 :  Execution Over Bye Bye
  

所有 主题都会给出相应的最终o / p   main()完成执行后的几秒钟

我理解所有线程彼此独立运行,并且我们可以进行主睡眠()直到所有 线程完成执行。

我想知道是否有办法以这样的方式做到这一点,这将允许我阻止任何线程相互等待,这样完成其执行的最后一个线程负责返回我的最终执行时间。

以下是代码

  

DataEntry.java

public class DataEntry {

    public static void main(String[] args) {

        long l = System.nanoTime();

//STRING THAT WILL BE USED TO DOWNLOAD THE MULTIPLE FILES

        String[] strDownload = {"https://unsplash.com/photos/n61ur6rT_F8/download?force=true",
                    "https://unsplash.com/photos/GLS3mY37RPo/download?force=true",
                    "https://unsplash.com/photos/v6asLq_dYzw/download?force=true",
                    "https://unsplash.com/photos/ePB2oGU8mb4/download?force=true",
                    "https://unsplash.com/photos/yEHQfGNKnZ4/download?force=true"};


        //CREATE A FIXED NUMBER OF THREADS BASED ON THE LENGTH OF THE INPUT STRING ARRAY
            for (int i = 0; i < strDownload.length; i++) {
                Thread t = new Thread(new ThreadsGeneration(strDownload[i]));   //PASSING THE i'th ELEMENT OF THE ARRAY AS THE PARAMETER FOR THE CONSTRUCTOR
                t.start();                                                      //CREATE THE THREAD
                System.out.println(t.getName()+"\n");

            }

            System.out.println("Total Execution Time Is : "+((double)(System.nanoTime()-l)/1000000)+" milli seconds");
        }
    }
  

ThreadGeneration.java

public class ThreadsGeneration implements Runnable{

    private static String string;

    public ThreadsGeneration(String string) {
        ThreadsGeneration.string = string;
    }

    @Override
    public void run() {
        System.out.println("Inside RUN");
        DownloadManager.getData(string);

    }   
}
  

DownloadManager.java

public class DownloadManager {


    public static void getData(String strDownload) {


        String strDestination = "C:\\Users\\admin\\Desktop\\"+Math.random()+".jpg";

        try {       

            printData(strDownload,strDestination);

        } catch (Exception e) {

            e.printStackTrace();
        }
    }

    private static synchronized void printData(String strDownload, String strDestination) throws Exception {

        URL url = new URL(strDownload);
        ReadableByteChannel rbc = Channels.newChannel(url.openConnection().getInputStream());
        FileOutputStream fos = new FileOutputStream(strDestination);
        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        fos.close();
        rbc.close();
        System.out.println("Everything done");
    }
}

1 个答案:

答案 0 :(得分:2)

我能想到的两种方式:

  1. 通过调用.join()加入主线程的所有线程,然后打印出所有线程加入的时间。这样,主线程将轻松打印所花费的时间。

    在这种情况下,主要不睡觉。它只是等待。

  2. 让您的主题在他们运行的代码结束时打印他们所花费的时间。这样你就可以看到每个线程的个别时间,并花费一些脑力循环来自己计算整体执行时间。