【问题标题】:Inlining after parsing parameters to optimize algorithm speed解析参数后内联优化算法速度
【发布时间】:2018-05-01 20:15:18
【问题描述】:

假设您需要实现一个非常快速的算法来解决某些问题,它可能取决于您将从某个数据源获取到内存中的一组参数。假设这些参数一旦被解析就会像常量一样(但仍然取决于问题)。如果知道这些常量以源代码开头并显式编写,我希望编译器内联它们,假设这些参数在瓶颈附近经常被访问,这可能会带来很好的速度改进。但是,如果它们在编译后由程序从外部源解析,则它们通常不会被内联,即使您为对象分配最终变量也是如此。 我想一个技巧可能是为每组值保存一个有效对象的副本,其中每组值都明确地写在代码中。然后可以使用相关的对象。但这会耗费大量内存,并且代码会成倍增长。 另一个想法可能是在解析参数集之后动态编译代码。

我的问题是:有没有什么东西可以优雅地处理这个问题,更具体地说是在 Java/C++ 中。

【问题讨论】:

  • 听起来您可能想使用 c++ template 并实例化一堆可能的常量值。
  • 但是如果我有十个布尔值,那已经是 2^10=1024 种可能性。现在可以有整数和双精度数,它呈指数增长。这些常量还可以控制代码流,因此内联可以帮助避免分支。目标是构建可定制且仍然快速的软件。
  • 那我不知道你说的是什么意思“为每组值保存一份有效对象的副本,其中每组值都明确写在代码中。”我>
  • 你明白我的意思,我只是不认为这是一个非常优雅的想法。我想知道是否有更好的方法。还是 c++ 模板在运行时内联常量?
  • 这个问题在各种正则表达式实现和库中不断得到优化。解决这个问题的方法不止一种。如果您考虑一下,您甚至可以在程序中包含一个编译器,然后将编译后的代码作为共享库加载。

标签: java c++ performance programming-languages inline


【解决方案1】:

在 Java 中,使用 JDK,您可以执行以下操作:

  1. 读取常量
  2. 编写一个包含代码的类,以便以final static public 类成员的形式打印参数集。然后为您的算法附加代码(在字符串中的某处)。
  3. 用内部JDK编译器编译(内存到内存编译是可能的)
  4. 加载生成的类并以某个静态方法启动它。或者创建一个类实例并使用它。

这是因为 java 编译器将 final static 变量视为不可变常量。

这是否让您的代码真的更快?我对此表示怀疑。要使这种方法产生好处,它必须运行足够长的时间来补偿编译、类加载等所需的 2 到 3 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-07-23
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多