加速Java代码

时间:2015-06-17 10:56:13

标签: java performance while-loop try-catch

我的代码速度有问题。我连接到2个WiFi模块并从status.xml获取实时数据。不幸的是它有2-3秒的延迟。我从来不必处理代码加速,所以这就是我需要帮助的原因。

public static void main(String[] args) {
    URL temp;
    URL move;
    String inputLine1 = null,inputLine2 = null;
    gui.setVisible(true);
    BufferedReader in1 = null, in2;
    try{
        temp = new URL("http://192.168.0.25/status.xml");
        move = new URL("http://192.168.0.26/status.xml");

        while(true) {
            in1 = new BufferedReader(new InputStreamReader(temp.openStream()));
            in2 = new BufferedReader(new InputStreamReader(move.openStream()));  

            while ((inputLine1 = in1.readLine()) != null) {
                if (inputLine1.contains("<adctemp>") ) {
                    Temperature = inputLine1;
                    Temperature = Temperature.replaceFirst("<adctemp>", "").replaceAll("</adctemp>", "");
                }
            }

            while ((inputLine2 = in2.readLine()) != null) {
                if(inputLine2.contains("<led2>")) {
                    Motion = inputLine2;
                    Motion = Motion.replaceFirst("<led2>", "").replaceAll("</led2>","");
                    if(Motion.contains("0")) {
                        Movement = 0;
                    }
                    else  {
                        Movement = 1;
                    }

                } 
            }

            Thread.run();
        }
    }catch(IOException e){
        e.printStackTrace();
    } 
}

4 个答案:

答案 0 :(得分:0)

网络速度是硬件,它将决定您可以获得多少性能。但就线程而言,您可以创建两个线程并在其中读取异步。目前它是按顺序发生的。

答案 1 :(得分:0)

检查问题是代码的速度还是wifi端点的速度。

如果问题出在wifi端点上,则代码中无法执行任何操作。

要检查您的代码,请使用模拟wifi端部从内存或文件(而非网络)读取数据。

如果问题仍然存在,您可以改进代码。在确定瓶颈是您的代码之前,请不要对其进行操作。

注意:您的代码中有Thread.run()。你对这条线的目的是什么?

答案 2 :(得分:0)

如果来自两个流的输入不必串行运行,那么您可以做的一个主要优化是并行地从两个输入流中读取。

只需将读取每个流的输入的代码放在一个单独的类中,然后在一个单独的线程中运行它,然后就可以使用join()来确保两者都完成了。

然而,由于线程创建和销毁相对昂贵,因此更好的优化是保持线程继续并通过线程同步在它们之间进行通信。由此产生的性能改进取决于内部while语句达到的次数,因此在开始时编写它是不成熟的优化。

答案 3 :(得分:-1)

由于我没有看到两个WiFi模块数据的处理之间有任何关系,我建议你创建2个线程,因此每个线程将尝试并行处理相应的模块,从而提高性能,

Thread th1 = new Thread() {
    public void run() {
        while(true) {
            BufferedReader in1 = new BufferedReader(new InputStreamReader(temp.openStream()));
            while ((inputLine1 = in1.readLine()) != null) {
                if (inputLine1.contains("<adctemp>") ) 
                {
                    Temperature = inputLine1;
                    Temperature = Temperature.replaceFirst("<adctemp>", "").replaceAll("</adctemp>", "");

                }
            }
        }
    }
};

Thread th2 = new Thread() {
    public void run() {
        while(true) {
            BufferedReader in2 = new BufferedReader(new InputStreamReader(move.openStream()));
            while ((inputLine2 = in2.readLine()) != null) {
                if(inputLine2.contains("<led2>"))
                {
                    Motion = inputLine2;
                    Motion = Motion.replaceFirst("<led2>", "").replaceAll("</led2>","");
                    if(Motion.contains("0"))
                    {Movement = 0;}
                    else 
                    {Movement = 1;}
                } 
            }
        }
    }
};

th1.start();
th2.start();