Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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
静态语言的运行时优化:C+的JIT+;? 有人使用JIT技巧来改进静态编译语言(如C++)的运行时性能吗?基于运行时观察的热点分析和分支预测似乎可以提高任何代码的性能,但可能有一些基本的战略原因,说明只有在虚拟机中才能在运行时进行此类观察和实现更改。我清楚地记得无意中听到的C++编译器编写者喃喃地说:“你也可以为C++编写的程序做这件事”,同时听动态语言爱好者谈论收集统计和重新排列代码,但是我的网络搜索证据支持这个内存已经枯竭了。p>_C++_Optimization_Jit_Performance - Fatal编程技术网

静态语言的运行时优化:C+的JIT+;? 有人使用JIT技巧来改进静态编译语言(如C++)的运行时性能吗?基于运行时观察的热点分析和分支预测似乎可以提高任何代码的性能,但可能有一些基本的战略原因,说明只有在虚拟机中才能在运行时进行此类观察和实现更改。我清楚地记得无意中听到的C++编译器编写者喃喃地说:“你也可以为C++编写的程序做这件事”,同时听动态语言爱好者谈论收集统计和重新排列代码,但是我的网络搜索证据支持这个内存已经枯竭了。p>

静态语言的运行时优化:C+的JIT+;? 有人使用JIT技巧来改进静态编译语言(如C++)的运行时性能吗?基于运行时观察的热点分析和分支预测似乎可以提高任何代码的性能,但可能有一些基本的战略原因,说明只有在虚拟机中才能在运行时进行此类观察和实现更改。我清楚地记得无意中听到的C++编译器编写者喃喃地说:“你也可以为C++编写的程序做这件事”,同时听动态语言爱好者谈论收集统计和重新排列代码,但是我的网络搜索证据支持这个内存已经枯竭了。p>,c++,optimization,jit,performance,C++,Optimization,Jit,Performance,VisualStudio提供了一个用于执行运行时评测的选项,该选项可用于优化代码 “配置文件引导优化”Microsoft Visual Studio将其称为“;您可以在网站上了解更多信息。基本上,您可以在附加了探查器的情况下运行程序多次,以记录其热点和其他性能特征,然后您可以将探查器的输出提供给编译器以获得适当的优化。配置文件引导优化不同于运行时优化。优化仍然是离线完成的,基于评测信息,但一旦二进制文件发布,就没有正在进行的优化,因此如果评测指导优化阶段的使用模式不能准确反映真实世界的使用情况,

VisualStudio提供了一个用于执行运行时评测的选项,该选项可用于优化代码


“配置文件引导优化”

Microsoft Visual Studio将其称为“;您可以在网站上了解更多信息。基本上,您可以在附加了探查器的情况下运行程序多次,以记录其热点和其他性能特征,然后您可以将探查器的输出提供给编译器以获得适当的优化。

配置文件引导优化不同于运行时优化。优化仍然是离线完成的,基于评测信息,但一旦二进制文件发布,就没有正在进行的优化,因此如果评测指导优化阶段的使用模式不能准确反映真实世界的使用情况,那么结果将是不完美的,程序也将无法适应不同的使用模式

您可能会很感兴趣地查找信息,尽管该系统主要关注本地二进制-原生二进制翻译,尽管由于C++几乎完全编译为本机代码,我想这正是您所要查找的。


您可能还想看看,它是一个编译器框架和中间表示,支持JIT编译和运行时优化,虽然我不确定是否有任何基于LLVM的运行时,可以编译C++和执行+运行时优化它。我实现的是图形渲染API。由于API将数千种不同的绘图模式定义为通用函数,因此速度会减慢

我最终为一种特定于领域的语言编写了自己的小Jit编译器(非常接近asm,但加入了一些高级控制结构和局部变量)

我得到的性能改进是10到60倍(取决于编译代码的复杂性),因此额外的工作获得了巨大的回报


在PC上,我不会开始编写自己的jit编译器,而是使用LIBJIT或LLVM进行jit编译。在我的例子中,这是不可能的,因为我当时正在开发一个LIBJIT/LLVM不支持的非主流嵌入式处理器,所以我不得不发明自己的。

合理的问题-但前提值得怀疑

在尼尔斯的回答中,有时“优化”意味着“低级优化”,这本身就是一个很好的主题

然而,它是基于“热点”的概念,而这一概念与通常给出的相关性相差甚远

定义:热点是进程的程序计数器花费大量时间的代码小区域

如果存在热点,例如占用大量时间的紧密的内部循环,则值得尝试在低级别进行优化,如果它是在您控制的代码中(即不在第三方库中)

现在假设内部循环包含对函数的调用,任何函数。现在不太可能在那里找到程序计数器,因为它更可能在函数中。因此,虽然代码可能是浪费,但它不再是一个热点

有许多常见的方法可以使软件变慢,其中热点就是其中之一。然而,根据我的经验,这是大多数程序员都知道的唯一一个问题,也是应用低级优化的唯一问题


我相信有人试图做到这一点。它试图在整个程序生命周期(编译时间、链接时间和运行时间)进行优化。

答案更可能是:没有人做的比PGO更适合C++,因为好处可能不明显。 让我详细说明一下:从开发人员的角度来看,JIT引擎/运行时既有优点也有缺点:它们在运行时有更多的信息,但要分析的时间却少得多。 有些优化非常昂贵,如果不对启动时间产生巨大影响,您不可能看到这些优化:循环展开、自动矢量化(在大多数情况下也基于循环展开)、指令选择(对于使用SSE4.1的CPU使用SSE4.1)以及指令调度和重排序(使用更好的超标量CPU)。这种优化与类似C的代码(可从C++访问)结合得很好

进行高级编译的单一成熟编译器体系结构(据我所知)是Java热点编译和使用分层编译(Java Azul的系统,当今流行的JaegerMonkey JS引擎)的具有类似原理的体系结构

但运行时最大的优化之一是:

多态内联缓存(这意味着,如果您使用某些类型运行第一个循环,第二次,循环的代码将是来自上一个循环的专用类型,JIT将设置一个保护,并将内联类型作为默认分支,并且基于它,使用基于SSA表单引擎的此专用表单将应用常量折叠/传播,inlining、死代码消除优化以及JIT的“高级”程度将改善或减少CPU寄存器分配。) 正如您可能注意到的,JIT(热点)将得到很大的改进