Kotlin-通过ID或字符串获取类实例属性值的高性能且可扩展的方式

时间:2019-03-01 23:44:10

标签: kotlin properties kotlin-reflect

我想让一个类及其子类的属性在运行时可用,以通过整数id或属性名称进行读取和写入,其性能尽可能接近常规编译的读写。 。该类可能有很多实例,并且是子类(最多一百万个子类),并且每个类可能具有数百个属性,因此我想最小化每个类实例中每个属性使用的内存。

我看到的广泛的解决方案组正在使用反射,将每个属性作为可变类的实例,然后保留这些映射,或者编写when语句。

我已经测试了反射实现的性能(请参见下文)。这是在我的测试中直接访问该属性所需时间的15倍。

这可以改善,还是有更好的方法呢?

foo2()

1 个答案:

答案 0 :(得分:0)

我认为您不会从反思中获得想要的表现。

(反射不是为高性能而设计的-根据我的经验,很少在生产代码中使用反射。这对测试,框架,构建工具等非常有用,但是在我所看到的大多数问题中真正的答案是使用不需要反射的更好的设计!)

当然,其他两种方法都不完美。这可能取决于确切的要求。这些到底是否必须是具有命名Kotlin属性的对象,还是一直都是简单的地图?后者可能更易于编码且易于维护。其他硬编码测试可能会节省内存。

(如果您有很多时间,您可能会考虑编写某种构建工具,该工具可以自动为您使用那些硬编码的测试生成查找方法。 将使用反射,当然,但只能在编译时进行。虽然这是一项艰巨的工作,但我不知道您将如何处理。)