[英]Speeding up Java Code
我的代码速度有问题。 我已连接到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();
}
}
网络速度是硬件,它将决定您可以获得多少性能。 但是就线程而言,您可以创建两个线程并在其中读取异步信息。 目前,它按顺序发生。
检查问题是代码速度还是wifi端点速度。
如果问题出在wifi端点上,那么您将无法在代码中执行任何操作。
要检查您的代码,请使用wifi终端部分的模型,该模型从内存或文件(不是从网络)读取数据。
如果问题仍然存在,则可以改进代码。 在确定瓶颈在于您的代码之前,请不要对其进行操作。
注意:您的代码中有一个Thread.run()
。 您对这条线的目的是什么?
如果两个流的输入不必串行运行,那么您可以做的一项主要优化就是并行读取两个输入流。
只需将从每个流中读取输入的代码放在单独的类中,然后在单独的线程中运行它,然后可以使用join()
来确保两者均已完成。
但是,由于创建和销毁线程的成本相对较高,因此更好的优化方法是保持线程继续运行并通过线程同步在它们之间进行通信。 从中获得的性能提高取决于内部while语句达到多少次,因此在开始时编写该语句可能为时过早。
由于我看不到两个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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.