上午测试了下并发情况下的表现,测试场景:一个有20个节点,包括选择、顺序、并行路由的流程,所有节点都设置为自动执行,1000个线程并发启动案例, 也就是这个流程同时有1000个案例在跑,全部跑完结果差强人意,比单线程慢了接近30倍。仔细调整了算法和加锁粒度,尽管整体性能有所提高,但是多线程 和单线程间执行的差距仍然没有多大变化,性能瓶颈还是在核心的调度算法上,还需要分析下。测试程序如下:
java 代码
 
  1. package net.rubyeye.insect.workflow.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.CyclicBarrier;  
  6.   
  7. import net.rubyeye.insect.workflow.Place;  
  8. import net.rubyeye.insect.workflow.Token;  
  9. import net.rubyeye.insect.workflow.Transition;  
  10. import net.rubyeye.insect.workflow.WorkFlow;  
  11. import net.rubyeye.insect.workflow.WorkFlowManager;  
  12. import net.rubyeye.insect.workflow.basic.BasicWorkflowManager;  
  13. import net.rubyeye.insect.workflow.comm.TransitionType;  
  14. import net.rubyeye.insect.workflow.config.DefaultConfiguration;  
  15. import junit.framework.TestCase;  
  16.   
  17. public class CompositeProcessTest extends TestCase {  
  18.     private WorkFlowManager wm;  
  19.   
  20.     WorkFlow composite;  
  21.   
  22.     private CyclicBarrier barrier;  
  23.   
  24.     private static final int total = 1000;  
  25.   
  26.     @Override  
  27.     protected void setUp() throws Exception {  
  28.         this.barrier = new CyclicBarrier(total + 1);  
  29.         wm = new BasicWorkflowManager();  
  30.         wm.setConfiguration(new DefaultConfiguration());  
  31.   
  32.         WorkFlow sequence = wm.getWorkFlow("sequence");  
  33.         WorkFlow concurrency = wm.getWorkFlow("concurrency");  
  34.         WorkFlow choose = wm.getWorkFlow("choose");  
  35.   
  36.         // 组合流程  
  37.         composite = new WorkFlow();  
  38.         composite.setName("composite");  
  39.         composite.setId(100);  
  40.   
  41.         wm.saveWorkFlow(composite);  
  42.   
  43.         // 修改开始结束节点的输入输出库所  
  44.         sequence.getEnd().setType(TransitionType.NORMAL);  
  45.         sequence.getEnd().setOutputs(concurrency.getStart().getInputs());  
  46.   
  47.         concurrency.getEnd().setType(TransitionType.NORMAL);  
  48.         concurrency.getEnd().setOutputs(choose.getStart().getInputs());  
  49.   
  50.         composite.setStart(sequence.getStart());  
  51.         composite.setEnd(choose.getEnd());  
  52.         List<Transition> transitions = new ArrayList<Transition>();  
  53.         transitions.addAll(sequence.getTransitions());  
  54.         transitions.addAll(concurrency.getTransitions());  
  55.         transitions.addAll(choose.getTransitions());  
  56.         composite.setTransitions(transitions);  
  57.     }  
  58.   
  59.     public void testConcurrencyCompositeProcesss() throws Exception {  
  60.         for (int i = 0; i < total; i++) {  
  61.             new FlowThread().start();  
  62.         }  
  63.         barrier.await();  
  64.         long start = System.currentTimeMillis();  
  65.         barrier.await();  
  66.         long end = System.currentTimeMillis();  
  67.         System.out.println("创建" + total + "个流程并发运行完毕\n花费时间:" + (end - start)  
  68.                 / 1000.0 + "秒");  
  69.         for (Transition transition : composite.getTransitions()) {  
  70.             System.out.println(transition.getName() + "  "  
  71.                     + transition.isEnable());  
  72.             for (Place place : transition.getOutputs()) {  
  73.                 System.out.println("place " + place.getId() + " "  
  74.                         + place.getTokens().size());  
  75.             }  
  76.         }  
  77.     }  
  78.   
  79.     public void testCompositeProcesss() throws Exception {  
  80.         long start = System.currentTimeMillis();  
  81.         for (int i = 0; i < total; i++) {  
  82.             Token token1 = wm.startWorkFlow("composite");  
  83.             token1.setAttribute("name""dennis");  
  84.             token1.setAttribute("num"21);  
  85.             wm.doAction(token1.getId());  
  86.             assertTrue(token1.isFinished());  
  87.         }  
  88.         long end = System.currentTimeMillis();  
  89.         System.out.println("创建" + total + "个流程运行完毕\n花费时间:" + (end - start)  
  90.                 / 1000.0 + "秒");  
  91.     }  
  92.   
  93.     class FlowThread extends Thread {  
  94.   
  95.         @Override  
  96.         public void run() {  
  97.             try {  
  98.                 barrier.await();  
  99.                 // wm = new BasicWorkflowManager();  
  100.                 Token token1 = wm.startWorkFlow("composite");  
  101.                 token1.setAttribute("name""dennis");  
  102.                 token1.setAttribute("num"21);  
  103.                 wm.doAction(token1.getId());  
  104.                 assertTrue(token1.isFinished());  
  105.                 barrier.await();  
  106.             } catch (Exception e) {  
  107.                 throw new RuntimeException(e);  
  108.             }  
  109.         }  
  110.   
  111.     }  
  112. }  
评论
发表评论

您还没有登录,请登录后发表评论

dennis_zane
搜索本博客
我的留言簿
  • 你好,看过你关于自定义classloader的回帖,想问问几个问题:   ...
    -- by llp20_2000
存档
最新评论