Improved performance of AbstractRecord.fieldsRow(), resulting in a

14% performance gain in a relevant Record.setValue(),
Record.getValue() benchmark
This commit is contained in:
Lukas Eder 2013-02-01 14:08:59 +01:00
parent 212e3c81a6
commit f4adc38d8e
9 changed files with 56 additions and 66 deletions

View File

@ -37,8 +37,6 @@
package org.jooq.util;
import static org.jooq.util.GenerationUtil.range;
import java.io.File;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
@ -70,7 +68,6 @@ import org.jooq.impl.ArrayRecordImpl;
import org.jooq.impl.DAOImpl;
import org.jooq.impl.DefaultDataType;
import org.jooq.impl.Executor;
import org.jooq.impl.Factory;
import org.jooq.impl.PackageImpl;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.SchemaImpl;
@ -544,13 +541,13 @@ public class JavaGenerator extends AbstractGenerator {
// fieldsRow()
out.tab(1).overrideInherit();
out.tab(1).println("public %s%s<%s> fieldsRow() {", Row.class, degree, rowType);
out.tab(2).println("return %s.row([[field%s()]]);", Factory.class, range(1, degree));
out.tab(2).println("return (%s%s) super.fieldsRow();", Row.class, degree);
out.tab(1).println("}");
// valuesRow()
out.tab(1).overrideInherit();
out.tab(1).println("public %s%s<%s> valuesRow() {", Row.class, degree, rowType);
out.tab(2).println("return %s.row([[value%s()]]);", Factory.class, range(1, degree));
out.tab(2).println("return (%s%s) super.valuesRow();", Row.class, degree);
out.tab(1).println("}");
// field[N]()

View File

@ -176,18 +176,18 @@ class Records extends Generators {
@Override
public RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> fieldsRow() {
return new RowImpl(fields);
return fields;
}
@Override
public final RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> valuesRow() {
return new RowImpl(vals(intoArray(), fields));
return new RowImpl(vals(intoArray(), fields.fields));
}
«FOR degree : (1..Constants::MAX_ROW_DEGREE)»
@Override
public final Field<T«degree»> field«degree»() {
return (Field<T«degree»>) fields[«degree - 1»];
return fields.field(«degree - 1»);
}
«ENDFOR»
«FOR degree : (1..Constants::MAX_ROW_DEGREE)»

View File

@ -1168,7 +1168,7 @@ class Rows extends Generators {
*/
private static final long serialVersionUID = -929427349071556318L;
private final Field<?>[] fields;
final Field<?>[] fields;
RowImpl(Field<?>... fields) {
super();

View File

@ -79,6 +79,7 @@ import org.jooq.tools.reflect.Reflect;
*
* @author Lukas Eder
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
abstract class AbstractRecord extends AbstractStore implements Record {
/**
@ -86,15 +87,15 @@ abstract class AbstractRecord extends AbstractStore implements Record {
*/
private static final long serialVersionUID = -6052512608911220404L;
final Field<?>[] fields;
final RowImpl fields;
Value<?>[] values;
AbstractRecord(Collection<? extends Field<?>> fields) {
this.fields = fields.toArray(new Field[fields.size()]);
this.fields = new RowImpl(fields);
}
AbstractRecord(Field<?>... fields) {
this.fields = fields;
this.fields = new RowImpl(fields);
}
// ------------------------------------------------------------------------
@ -133,12 +134,12 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final Field<?> field(int index) {
return index >= 0 && index < fields.length ? fields[index] : null;
return index >= 0 && index < fields.size() ? fields.field(index) : null;
}
@Override
public final Field<?>[] fields() {
return fields.clone();
return fields.fields();
}
// ------------------------------------------------------------------------
@ -147,7 +148,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final int size() {
return fields.length;
return fields.size();
}
@Override
@ -220,7 +221,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
return getValue(field(fieldName));
}
@SuppressWarnings("unchecked")
@Override
public final Object getValue(String fieldName, Object defaultValue) {
return getValue((Field<Object>) field(fieldName), defaultValue);
@ -248,7 +248,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
return result == null ? defaultValue : result;
}
@SuppressWarnings("unchecked")
final <T> Value<T> getValue0(int index) {
Value<?>[] v = getValues();
@ -265,7 +264,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
final Value<?>[] getValues() {
if (values == null) {
values = new Value<?>[fields.length];
values = new Value<?>[fields.size()];
for (int i = 0; i < values.length; i++) {
values[i] = new Value<Object>(null);
@ -336,7 +335,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
*/
@Override
public Record original() {
AbstractRecord result = Utils.newRecord(getClass(), fields, getConfiguration());
AbstractRecord result = Utils.newRecord(getClass(), fields.fields, getConfiguration());
Value<?>[] v = getValues();
for (int i = 0; i < v.length; i++) {
@ -346,7 +345,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
return result;
}
@SuppressWarnings("unchecked")
@Override
public final <T> T original(Field<T> field) {
return (T) original(fieldsRow().indexOf(field));
@ -441,8 +439,9 @@ abstract class AbstractRecord extends AbstractStore implements Record {
public final Map<String, Object> intoMap() {
Map<String, Object> map = new LinkedHashMap<String, Object>();
for (int i = 0; i < fields.length; i++) {
Field<?> field = fields[i];
int size = fields.size();
for (int i = 0; i < size; i++) {
Field<?> field = fields.field(i);
if (map.put(field.getName(), getValue(i)) != null) {
throw new InvalidResultException("Field " + field.getName() + " is not unique in Record : " + this);
@ -474,7 +473,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
}
}
@SuppressWarnings("unchecked")
@Override
public final <E> E into(E object) {
if (object == null) {
@ -510,7 +508,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
* may make sense to supply <code>String[]</code>, <code>Integer[]</code>
* etc.
*/
@SuppressWarnings("unchecked")
private final <E> E intoArray(Class<? extends E> type) {
int size = size();
Class<?> componentType = type.getComponentType();
@ -571,7 +568,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
* Convert this record into an "immutable" POJO (final fields, "matching"
* constructor).
*/
@SuppressWarnings("unchecked")
private final <E> E intoImmutablePOJO(Class<? extends E> type) throws Exception {
Constructor<E>[] constructors = (Constructor<E>[]) type.getDeclaredConstructors();
@ -732,7 +728,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final ResultSet intoResultSet() {
ResultImpl<Record> result = new ResultImpl<Record>(getConfiguration(), fields);
ResultImpl<Record> result = new ResultImpl<Record>(getConfiguration(), fields.fields);
result.add(this);
return result.intoResultSet();
}
@ -742,7 +738,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
return mapper.map(this);
}
@SuppressWarnings("unchecked")
@Override
public final void from(Object source) {
if (source == null) return;
@ -800,8 +795,9 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final void fromMap(Map<String, ?> map) {
for (int i = 0; i < fields.length; i++) {
Field<?> field = fields[i];
int size = fields.size();
for (int i = 0; i < size; i++) {
Field<?> field = fields.field(i);
String name = field.getName();
// Set only those values contained in the map
@ -813,8 +809,9 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final void fromArray(Object... array) {
for (int i = 0; i < fields.length && i < array.length; i++) {
Utils.setValue(this, fields[i], array[i]);
int size = fields.size();
for (int i = 0; i < size && i < array.length; i++) {
Utils.setValue(this, fields.field(i), array[i]);
}
}
@ -908,12 +905,11 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public String toString() {
Result<AbstractRecord> result = new ResultImpl<AbstractRecord>(getConfiguration(), fields);
Result<AbstractRecord> result = new ResultImpl<AbstractRecord>(getConfiguration(), fields.fields);
result.add(this);
return result.toString();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public int compareTo(Record that) {
// Note: keep this implementation in-sync with AbstractStore.equals()!
@ -1010,7 +1006,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
/**
* Compare two arrays
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
final int compare(Object[] array1, Object[] array2) {
int length = Math.min(array1.length, array2.length);

View File

@ -130,122 +130,122 @@ implements
@Override
public RowImpl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> fieldsRow() {
return new RowImpl(fields);
return fields;
}
@Override
public final RowImpl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> valuesRow() {
return new RowImpl(vals(intoArray(), fields));
return new RowImpl(vals(intoArray(), fields.fields));
}
@Override
public final Field<T1> field1() {
return (Field<T1>) fields[0];
return fields.field(0);
}
@Override
public final Field<T2> field2() {
return (Field<T2>) fields[1];
return fields.field(1);
}
@Override
public final Field<T3> field3() {
return (Field<T3>) fields[2];
return fields.field(2);
}
@Override
public final Field<T4> field4() {
return (Field<T4>) fields[3];
return fields.field(3);
}
@Override
public final Field<T5> field5() {
return (Field<T5>) fields[4];
return fields.field(4);
}
@Override
public final Field<T6> field6() {
return (Field<T6>) fields[5];
return fields.field(5);
}
@Override
public final Field<T7> field7() {
return (Field<T7>) fields[6];
return fields.field(6);
}
@Override
public final Field<T8> field8() {
return (Field<T8>) fields[7];
return fields.field(7);
}
@Override
public final Field<T9> field9() {
return (Field<T9>) fields[8];
return fields.field(8);
}
@Override
public final Field<T10> field10() {
return (Field<T10>) fields[9];
return fields.field(9);
}
@Override
public final Field<T11> field11() {
return (Field<T11>) fields[10];
return fields.field(10);
}
@Override
public final Field<T12> field12() {
return (Field<T12>) fields[11];
return fields.field(11);
}
@Override
public final Field<T13> field13() {
return (Field<T13>) fields[12];
return fields.field(12);
}
@Override
public final Field<T14> field14() {
return (Field<T14>) fields[13];
return fields.field(13);
}
@Override
public final Field<T15> field15() {
return (Field<T15>) fields[14];
return fields.field(14);
}
@Override
public final Field<T16> field16() {
return (Field<T16>) fields[15];
return fields.field(15);
}
@Override
public final Field<T17> field17() {
return (Field<T17>) fields[16];
return fields.field(16);
}
@Override
public final Field<T18> field18() {
return (Field<T18>) fields[17];
return fields.field(17);
}
@Override
public final Field<T19> field19() {
return (Field<T19>) fields[18];
return fields.field(18);
}
@Override
public final Field<T20> field20() {
return (Field<T20>) fields[19];
return fields.field(19);
}
@Override
public final Field<T21> field21() {
return (Field<T21>) fields[20];
return fields.field(20);
}
@Override
public final Field<T22> field22() {
return (Field<T22>) fields[21];
return fields.field(21);
}
@Override

View File

@ -162,7 +162,7 @@ implements
*/
private static final long serialVersionUID = -929427349071556318L;
private final Field<?>[] fields;
final Field<?>[] fields;
RowImpl(Field<?>... fields) {
super();

View File

@ -75,10 +75,9 @@ public class TableRecordImpl<R extends TableRecord<R>> extends AbstractRecord im
/*
* Subclasses may override this method
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Row fieldsRow() {
return new RowImpl(fields);
return fields;
}
/*
@ -87,7 +86,7 @@ public class TableRecordImpl<R extends TableRecord<R>> extends AbstractRecord im
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Row valuesRow() {
return new RowImpl(vals(intoArray(), fields));
return new RowImpl(vals(intoArray(), fields.fields));
}
@SuppressWarnings("unchecked")

View File

@ -77,10 +77,9 @@ public class UDTRecordImpl<R extends UDTRecord<R>> extends AbstractRecord implem
/*
* Subclasses may override this method
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Row fieldsRow() {
return new RowImpl(fields);
return fields;
}
/*
@ -89,7 +88,7 @@ public class UDTRecordImpl<R extends UDTRecord<R>> extends AbstractRecord implem
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Row valuesRow() {
return new RowImpl(vals(intoArray(), fields));
return new RowImpl(vals(intoArray(), fields.fields));
}
@Override

View File

@ -329,7 +329,7 @@ public class UpdatableRecordImpl<R extends UpdatableRecord<R>> extends TableReco
@Override
public final void refresh() {
refresh(fields);
refresh(fields.fields);
}
@Override