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; }
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; } }
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();
java version "1.7.0_21" Java (TM) SE Runtime Environment (build 1.7.0_21-b11) Java HotSpot (TM) 64-Bit VM Server (build 23.21-b01, mixed mode)
Warming up ... Generated code: public boolean c (examples.data.CashAccountRow r) {return r.getAmount ()> = 0 && r.getAmount () <= 0 && r.getHeight ()> = 0 && r.getHeight () <= 0 && r .getGender ()> = 0 && r.getGender () <= 0 && true; } Running benchmark ... Number of records matched: 38 Elapsed time: 18ms Used Memory: 81MB
Generated rows: 10,000,000 C ++ - Searching ... C ++ - optimized search took 0.039000 seconds. Found rows: 38 C-Searching ... C-search took 0.053000 seconds. The C ++ faster than C: 1.358974 times Found rows: 38
Generated rows: 10,000,000 C ++ - Searching ... C ++ - optimized search took 0.012000 seconds Found rows: 38 C-Searching ... C-search took 0.051000 seconds. The C ++ faster than C: 4.250000 times Found rows: 38
Source: https://habr.com/ru/post/182788/
All Articles