getDeclaredFields()绝对性能

时间:2013-05-06 09:35:59

标签: java performance

我有一个表示数据库中条目的Java类。因此,每个字段都是数据库中的一列。

当我想更新该数据库时,我构造了一个ContentValues对象。

ArrayList<T> contentValues = new ArrayList<T>()

//bla bla add ten items to contentValues`

ArrayList<T> = new ArrayList<T>(ThisClass.class.getDeclaredFields().length);
//bla bla add ten items to contentValues

getDeclaredFields的绝对表现是什么?我希望有人能够指出getDeclaredFields的工作原理。我知道容器的大小调整是如何工作的,但我不知道getDeclaredFields如何工作以及如何工作。

2 个答案:

答案 0 :(得分:5)

使用与ContentValues相同的设置使用简单的HashMap进行微基准测试(假设这是您所指的类),并添加10个字段(即一个调整大小操作):

Benchmark                                    Mean   Mean error          Var    Units
c.a.p.g.a.Reflection.getDeclaredFields     326.405        5.989       33.961  nsec/op
c.a.p.g.a.Reflection.resize                247.581        7.377       51.520  nsec/op

所以getDeclaredFields比调整地图大小要慢一些,但桌面PC上的差异只有100纳秒。

ThisClass添加更多字段时,getDeclaredFields会变慢,所以我倾向于使用自动调整大小的方法。

代码:

@GenerateMicroBenchmark(BenchmarkType.AverageTimePerOp)
public Map getDeclaredFields() {
    Map m = new HashMap(ThisClass.class.getDeclaredFields().length, 1.0f);
    for (int i = 0; i < 9; i++) {
        m.put(i, "a");
    }
    return m;
}

@GenerateMicroBenchmark(BenchmarkType.AverageTimePerOp)
public Map resize() {
    Map m = new HashMap(8, 0.75f);
    for (int i = 0; i < 9; i++) {
        m.put(i, "a");
    }
    return m;
}

class ThisClass {
    private int i, j, k;
    public String s, t, u;
    protected List l, m, n;
}

答案 1 :(得分:0)

ContentValues contentValues = new ContentValues()

我会说执行时间差异不大。