Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中生成代码的性能和缓存_Scala_Reflection_Scala Quasiquotes - Fatal编程技术网

Scala中生成代码的性能和缓存

Scala中生成代码的性能和缓存,scala,reflection,scala-quasiquotes,Scala,Reflection,Scala Quasiquotes,我需要在运行时生成一个trait的实现,然后在trait的实例上执行一个已知的方法。在本例中,我正在运行A的A方法: import reflect.runtime._, universe._, tools.reflect.ToolBox package p { trait A { def a: String } val tb = currentMirror.mkToolBox() val d: A = tb.eval(q"""class C extends p.A { def a

我需要在运行时生成一个trait的实现,然后在trait的实例上执行一个已知的方法。在本例中,我正在运行
A
A
方法:

import reflect.runtime._, universe._, tools.reflect.ToolBox

package p {
  trait A { def a: String }
  val tb = currentMirror.mkToolBox()
  val d: A = tb.eval(q"""class C extends p.A { def a = "foo" }; new C""").asInstanceOf[A]
  println(d.a) // "foo"  
}
围绕这一点的几个问题:

  • 用例对性能非常敏感(在数据管理系统中运行生成的查询)
    tb.eval
    是否生成与scalac在编译时而不是运行时编译的字节码相同的字节码
  • 我想缓存生成的类,这样就不必为已经编译的已知查询重新编译它。我可以获取生成的类的字节并将其存储在类加载器中吗
  • 有没有一种更优雅的方法来做到这一点,可以避免使用
    替代
  • 更新:添加有关我的用例的详细信息:

    我正在研究一个分布式柱状数据存储的查询系统。我们有一个现有的基于Scala的查询系统,该系统性能良好。我的目标是将传入的SQL查询编译成Scala,以便它可以在现有系统上运行

    我已经建立了一个基于解释的版本,它运行速度慢了大约8倍。我也开始了一个ASM版本,部分实现了代码>选择< /C>,它的性能与Scala系统(预期两者都会产生几乎相同的字节码)一致。 性能最重要的方面是运行动态生成的代码,因为在集群中参与查询的每台机器上都会产生成本(当前集群有60台机器,但随着数据集的大小不断增加),并且生成的代码用于扫描数十亿条记录。所以我不太关心使用反射和代码生成来生成字节码,只要它的性能合理

    我需要实现的特性是查询接口。实际上,它是一个抽象类,使Java更容易使用。下面是一个高度简化的示例:

    abstract class BaseQuery[R <: Result[R]] {
      def init(parameters: Option[JSONObject])
      def execute(partitionKey: String, subpartitionKey: String, numSubpartitions: Int, page: ColumnSet, referenceData: Map[String, Any]): Option[R]
    }
    

    abstract class BaseQuery[R如果您所做的是对性能敏感的,并且反射和代码生成的混合可能是最糟糕的答案(另外,通常是不安全的)。肯定有更优雅的方法,但您需要重新审视“我需要在运行时生成特性的实现”的假设更详细地描述你潜在的问题…@DanielL。很抱歉回答得太慢,我正在旅行。我在问题中添加了更多的细节。我关心的不是生成代码本身的性能,而是运行生成的代码。我也愿意接受其他建议。