рдЬрд╛рд╡рд╛, рд░рдирдЯрд╛рдЗрдо рдЕрдиреБрдХреВрд▓рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ

рдмрд╣реБрдд рдЦреБрд╢реА рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рд▓реЗрдЦ рдкрдврд╝рд╛: рд╕реА рдФрд░ рд╕реА ++ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк рдФрд░ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рд╕реА рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ ред рд╡реЗ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╢рд░реНрдд рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЖрдЗрдП рдХреБрдЫ рд╕рдорд╛рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд░рдирдЯрд╛рдЗрдо рд╕рд┐рд╕реНрдЯрдо, рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрдкрдХреЛ рдордХреНрдЦреА рдкрд░ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдорд╛рди рд╣реИ - рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд░реИрдЦрд┐рдХ рдЦреЛрдЬред рдореИрдВ C / C ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рддреБрд▓рдиреАрдп рд░рдирдЯрд╛рдЗрдо рдФрд░ рдореЗрдореЛрд░реА рдЦрдкрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рд╣рдорд╛рд░реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд▓реЛрдВрдЧ рдФрд░ рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИ: CashAccountRow ред

рдЕрдиреНрдп рд╕рднреА рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреИрд╢рдЕрдХрд╛рдЙрдВрдЯрд╕реНрдЯреЛрд░ рд╡рд░реНрдЧ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рднрд░реЗрдВред CashAccountFinder рдПрдХ рдЖрджрд┐рдо DSL рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рдзреЗрдп рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдордХреНрдЦреА рдкрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдмрд┐рдирд╛ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддреБрд▓рдирд╛ рджреА рдЬрд╛рддреА рд╣реИ, рд╡рд┐рдзреЗрдп рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдбрдЧреЗрдЯрд░ рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИред
рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдореИрдк рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реЙрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдмрд┐рдирд╛ рдЦреЛрдЬреЗрдВ:
public final int find(final CashAccountFinder finder) { int rValue = 0; CashAccountRow c = new CashAccountRow(); finder.compileList(); for(int i = 0; i < ROW_COUNT; ++i) { if(finder.isMatched(c.setBitStorage(accountRows[i]))) { ++rValue; } } return rValue; } 

рдордХреНрдЦреА рдкрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Javassist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред Find2 рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдмрдирддрд╛ рд╣реИ:
 public final int find2(final CashAccountFinder finder) throws Throwable{ finder.compileList(); StringBuilder cname = new StringBuilder(); for(CashAccountFinder.PredicateHolder p: finder.predicateHolderArray) { cname.append(p.field.toString()); } 

рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╕реЗрдЯ рдФрд░ рд╡рд┐рдзреЗрдп рдЖрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 if(classMapper.containsKey(cname.toString())) { matcherBase = classMapper.get(cname.toString()); } 

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ:
 //     ClassPool classPool = ClassPool.getDefault(); //  classpath      // (     classloader', //      application ,   exec-maven-plugin ) classPool.insertClassPath(new ClassClassPath(this.getClass())); //    CtClass base = classPool.get("examples.data.GenMatcherBase"); //    CtClass gen = classPool.makeClass("examples.data.GenMatcher" + cname, base); //       StringBuilder sb = new StringBuilder("public boolean c(examples.data.CashAccountRow r){ return "); for(CashAccountFinder.PredicateHolder p: finder.predicateHolderArray) { switch (p.field) { case AGE: sb.append("r.getAge() >= " + p.minValue + " && r.getAge() <= " + p.maxValue + " && "); break; case AMOUNT: sb.append("r.getAmount() >= " + p.minValue + " && r.getAmount() <= " + p.maxValue + " && "); break; case CODE: sb.append("r.getCode() >= " + p.minValue + " && r.getCode() <= " + p.maxValue + " && "); break; case GENDER: sb.append("r.getGender() >= " + p.minValue + " && r.getGender() <= " + p.maxValue + " && "); break; case HEIGHT: sb.append("r.getHeight() >= " + p.minValue + " && r.getHeight() <= " + p.maxValue + " && "); break; } } sb.append("true; }"); //      gen.addMethod(CtMethod.make(sb.toString(), gen)); //      matcherBase = (GenMatcherBase) gen.toClass().newInstance(); classMapper.put(cname.toString(), matcherBase); 

рдЦреЛрдЬ:
  CashAccountRow c = new CashAccountRow(); int rValue = 0; for(int i = 0; i < ROW_COUNT; ++i) { if(matcherBase.c(c.setBitStorage(accountRows[i]))) { ++rValue; } } 

рдореБрдЦреНрдп рд░реВрдк рд╕реЗ, рдЦреЛрдЬ рдХреЛ 2 рдмрд╛рд░ рдЪрд▓рд╛рдПрдВред рдкрд╣рд▓рд╛ рд▓реЙрдиреНрдЪ "рд╡рд╛рд░реНрдорд┐рдВрдЧ рдЕрдк" рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЬреАрдЯ рдФрд░ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХрд╛рдо рд╣реЛред
  System.out.println("Warming up..."); store.find2(finder); System.out.println("Running benchmark..."); long millis = System.currentTimeMillis(); int i = store.find2(finder); long endMillis = System.currentTimeMillis(); 

JVM:
 рдЬрд╛рд╡рд╛ рд╕рдВрд╕реНрдХрд░рдг "1.7.0_21"
 рдЬрд╛рд╡рд╛ (TM) рдПрд╕рдИ рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (рдмрд┐рд▓реНрдб 1.7.0_21-b11)
 рдЬрд╛рд╡рд╛ рд╣реЙрдЯрд╕реНрдкреЙрдЯ (рдЯреАрдПрдо) 64-рдмрд┐рдЯ рд╕рд░реНрд╡рд░ рд╡реАрдПрдо (23.21-b01, рдорд┐рд╢реНрд░рд┐рдд рдореЛрдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг)

рдХреЛрд░ I5-2500k 3.3GHz рдкрд░ рд▓реЙрдиреНрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
 рдЧрд░реНрдо рд╣реЛ рд░рд╣рд╛ рд╣реИ ...
 рдЙрддреНрдкрдиреНрди рдХреЛрдб:
 рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрд▓рд┐рдпрди c (рдЙрджрд╛рд╣рд░рдг.data.CashAccountRow r) {рд╡рд╛рдкрд╕реА r.getAmount ()> = 0 && r.getAmount () <= 0 && r.getHeight ()>> 0 && r.getHeight () <= 0 && r .getGender ()> = 0 && r.getGender () <= 0 && рд╕рддреНрдп;  }
 рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...
 рдорд┐рд▓рд╛рди рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛: 38
 рдмреАрддрд╛ рд╕рдордп: 18ms
 рдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА: 81 рдПрдордмреА

рдЙрд╕реА рдорд╢реАрди рдкрд░ рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
 рдЙрддреНрдкрдиреНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 10,000,000
 C ++ - рдЦреЛрдЬ рд░рд╣рд╛ рд╣реИ ...
 C ++ - рдЕрдиреБрдХреВрд▓рд┐рдд рдЦреЛрдЬ рдореЗрдВ 0.039000 рд╕реЗрдХрдВрдб рд▓рдЧреЗред
 рдорд┐рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 38
 рд╕реА-рд╕рд░реНрдЪрд┐рдВрдЧ ...
 рд╕реА-рд╕рд░реНрдЪ рдореЗрдВ 0.053000 рд╕реЗрдХрдВрдб рд▓рдЧреЗред
 C ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ C ++ рддреЗрдЬ: 1.358974 рдмрд╛рд░
 рдорд┐рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 38

рдЙрд╕реА рдорд╢реАрди рдкрд░ рджреВрд╕рд░реЗ рд▓реЗрдЦ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
 рдЙрддреНрдкрдиреНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 10,000,000
 C ++ - рдЦреЛрдЬ рд░рд╣рд╛ рд╣реИ ...
 C ++ - рдЕрдиреБрдХреВрд▓рд┐рдд рдЦреЛрдЬ рдореЗрдВ 0.012000 рд╕реЗрдХрдВрдб рд▓рдЧреЗ
 рдорд┐рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 38
 рд╕реА-рд╕рд░реНрдЪрд┐рдВрдЧ ...
 рд╕реА-рд╕рд░реНрдЪ рдореЗрдВ 0.051000 рд╕реЗрдХрдВрдб рд▓рдЧреЗред
 C ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ C ++ рддреЗрдЬ: 4.250000 рдмрд╛рд░
 рдорд┐рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 38

рд▓рдЧрднрдЧ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕реА ++ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдлреНрд▓рд╢ред рдХреЛрдб GitHub.com рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/In182788/


All Articles