免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1436 | 回复: 3
打印 上一主题 下一主题

JAVA调试通不过 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-06 12:39 |只看该作者 |倒序浏览
下面的这个小程序调试通过并能运行,但发现效率不高,在两台机器上运行,发现四个问题:1、两台机器的CPU的占用率比较高,可以达到50%以上(机器还算可以的服务器为AMD3400+,客户端为2.8G preset的),2、对网络资源占用比较厉害,居然会用到10M的带宽!!!3、运行效率不高,10000次调用要10多秒,100000次就更不必说了;4、程序运行出现Net link start...之后,要比较久(2~5秒钟)才能进行网络调用,这个连接的过程是比较久的。

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient {

    public static void main(String[] args) {
       System.out.println("Net link start...");
       for(int i=0;i<100000;i++)
       {
       try {
           Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");  
           /* System.out.println( c.sub(4, 3) );
            System.out.println( c.add(4, 5) );
            System.out.println( c.mul(3, 6) );
            System.out.println( c.div(9, 3) );   */
            c.sub(4, 3);
            c.add(4, 5);
            c.mul(3, 6);
            c.div(9, 3);
        }
        catch (MalformedURLException murle) {
            System.out.println();
            System.out.println(
              "MalformedURLException");
            System.out.println(murle);
        }
        catch (RemoteException re) {
            System.out.println();
            System.out.println(
                        "RemoteException");
            System.out.println(re);
        }
        catch (NotBoundException nbe) {
            System.out.println();
            System.out.println(
                       "NotBoundException");
            System.out.println(nbe);
        }
        catch (
            java.lang.ArithmeticException
                                      ae) {
            System.out.println();
            System.out.println(
             "java.lang.ArithmeticException");
            System.out.println(ae);
        }
    }
   }
}

分析该程序,发现可以做一点优化:每个循环都会执行Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");  其实C初始化了一次之后,就可以多次使用,要怎样优化才能更好?

把它改成这样,总是调试不成功:
//CalculatorClient.java



import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient {

    public static void main(String[] args) {
       System.out.println("Net link start...");
       boolean j=false;
   
      for(int i=0;i<100000;i++)
       {
       try {
          if(j==false)
            { Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");
             j=true;
            }
           // Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");  
           /* System.out.println( c.sub(4, 3) );
            System.out.println( c.add(4, 5) );
            System.out.println( c.mul(3, 6) );
            System.out.println( c.div(9, 3) );   */
            c.sub(4, 3);
            c.add(4, 5);
            c.mul(3, 6);
            c.div(9, 3);
        }
        catch (MalformedURLException murle) {
            System.out.println();
            System.out.println(
              "MalformedURLException");
            System.out.println(murle);
        }
        catch (RemoteException re) {
            System.out.println();
            System.out.println(
                        "RemoteException");
            System.out.println(re);
        }
        catch (NotBoundException nbe) {
            System.out.println();
            System.out.println(
                       "NotBoundException");
            System.out.println(nbe);
        }
        catch (
            java.lang.ArithmeticException
                                      ae) {
            System.out.println();
            System.out.println(
             "java.lang.ArithmeticException");
            System.out.println(ae);
        }
    }
   }
}

或者这样改也不行:
//CalculatorClient.java



import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient {

    public static void main(String[] args) {
       System.out.println("Net link start...");
      
    Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");

      for(int i=0;i<100000;i++)
       {
       try {
           // Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");  
           /* System.out.println( c.sub(4, 3) );
            System.out.println( c.add(4, 5) );
            System.out.println( c.mul(3, 6) );
            System.out.println( c.div(9, 3) );   */
            c.sub(4, 3);
            c.add(4, 5);
            c.mul(3, 6);
            c.div(9, 3);
        }
        catch (MalformedURLException murle) {
            System.out.println();
            System.out.println(
              "MalformedURLException");
            System.out.println(murle);
        }
        catch (RemoteException re) {
            System.out.println();
            System.out.println(
                        "RemoteException");
            System.out.println(re);
        }
        catch (NotBoundException nbe) {
            System.out.println();
            System.out.println(
                       "NotBoundException");
            System.out.println(nbe);
        }
        catch (
            java.lang.ArithmeticException
                                      ae) {
            System.out.println();
            System.out.println(
             "java.lang.ArithmeticException");
            System.out.println(ae);
        }
    }
   }
}

[ 本帖最后由 jxh_ty 于 2005-12-6 13:46 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-06 15:51 |只看该作者
看看这样呢?

  1. import java.rmi.Naming;
  2. import java.rmi.RemoteException;
  3. import java.net.MalformedURLException;
  4. import java.rmi.NotBoundException;

  5. public class CalculatorClient {

  6.         public static void main(String[] args) {
  7.                 System.out.println("Net link start...");
  8.                 try {
  9.                         Calculator c =
  10.                                 (Calculator) Naming.lookup(
  11.                                         "rmi://192.168.1.10/CalculatorService");

  12.                         for (int i = 0; i < 100000; i++) {
  13.                                 // Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");  
  14.                                 /* System.out.println( c.sub(4, 3) );
  15.                                  System.out.println( c.add(4, 5) );
  16.                                  System.out.println( c.mul(3, 6) );
  17.                                  System.out.println( c.div(9, 3) );   */
  18.                                 c.sub(4, 3);
  19.                                 c.add(4, 5);
  20.                                 c.mul(3, 6);
  21.                                 c.div(9, 3);
  22.                         }
  23.                 } catch (MalformedURLException murle) {
  24.                         System.out.println();
  25.                         System.out.println("MalformedURLException");
  26.                         System.out.println(murle);
  27.                 } catch (RemoteException re) {
  28.                         System.out.println();
  29.                         System.out.println("RemoteException");
  30.                         System.out.println(re);
  31.                 } catch (NotBoundException nbe) {
  32.                         System.out.println();
  33.                         System.out.println("NotBoundException");
  34.                         System.out.println(nbe);
  35.                 } catch (java.lang.ArithmeticException ae) {
  36.                         System.out.println();
  37.                         System.out.println("java.lang.ArithmeticException");
  38.                         System.out.println(ae);
  39.                 }

  40.         }
  41. }
复制代码

[ 本帖最后由 knight-yl 于 2005-12-6 16:14 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2005-12-06 18:15 |只看该作者
不错,厉害!!!学习中.....
经过这样一改,速度提高了将近40~60%(执行同样的任务所需时间缩短了将近一半),CPU的占用率也没那么高了,有没有办法再降低网络带宽的占用?用压缩?怎么压?

[ 本帖最后由 jxh_ty 于 2005-12-6 18:24 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2005-12-06 20:05 |只看该作者
使用多线程完成相同的任务更快,不过这个“快”是建立在高CPU的利用率和高消耗上,因为CPU的使用率也将近多了一倍。

//CalculatorClient2.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

import java.util.*;

/////////////////////////////////////
class LoopCalculator implements Runnable {

LoopCalculator()
{
}

public void run()
{

try {
                        Calculator c =
                                (Calculator) Naming.lookup(
                                        "rmi://192.168.1.10/CalculatorService");

                        for (int i = 0; i < 100000/2; i++) {
                                // Calculator c = (Calculator)Naming.lookup("rmi://192.168.1.10/CalculatorService");  
                                /* System.out.println( c.sub(4, 3) );
                                 System.out.println( c.add(4, 5) );
                                 System.out.println( c.mul(3, 6) );
                                 System.out.println( c.div(9, 3) );   */
                                c.sub(4, 3);
                                c.add(4, 5);
                                c.mul(3, 6);
                                c.div(9, 3);
                        }
                       c=null;
                }
                catch (MalformedURLException murle) {
                        System.out.println();
                        System.out.println("MalformedURLException");
                        System.out.println(murle);
                } catch (RemoteException re) {
                        System.out.println();
                        System.out.println("RemoteException");
                        System.out.println(re);
                } catch (NotBoundException nbe) {
                        System.out.println();
                        System.out.println("NotBoundException");
                        System.out.println(nbe);
                } catch (java.lang.ArithmeticException ae) {
                        System.out.println();
                        System.out.println("java.lang.ArithmeticException");
                        System.out.println(ae);
                }

        }


}




public class CalculatorClient2 {

        public static void main(String[] args) {
                System.out.println("Net link start...");
         
        Thread t1=new Thread(new LoopCalculator());  
        Thread t2=new Thread(new LoopCalculator());
        t1.start();
        t2.start();
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP