我已经在llvm.org上使用在线编译器生成了一个bc文件,我想知道是否可以从ac或c ++程序加载这个bc文件,用llvm jit执行bc文件中的IR(以编程方式在c程序),并得到结果.
我怎么能做到这一点?
是否有人使用JIT技巧来提高静态编译语言(如C++)的运行时性能?看起来热点分析和基于运行时期间观察的分支预测可以提高任何代码的性能,但也许有一些基本的战略原因,为什么在运行时进行这样的观察和实现更改只能在虚拟机中实现.我清楚地记得听到C++编译器编写者嘀咕着"你也可以为用C++编写的程序做到这一点",同时听动态语言爱好者谈论收集统计数据和重新安排代码,但我的网络搜索支持这种记忆的证据已经枯竭了.
我听说iOS AppStore中不允许使用JIT编译代码,因为禁止在堆中放置可执行代码.那对吗?还是只是谣言?
我有一个非常大的JavaScript用于设备的HTML页面.
但它有点慢.我尝试压缩JavaScript文件但它仍然不能令人满意.
所以我在想,是否有可能将它作为一个及时编译转换为机器代码并使用它?(希望我的理解是正确的)我使用基于WebKit的浏览器.
如果有人这样做了,请提供"如何"页面或相关信息的链接.
当我发现这个时,我正在阅读.NET源代码:
// Constructs a Decimal from an integer value.
//
public Decimal(int value) {
// JIT today can't inline methods that contains "starg" opcode.
// For more details, see DevDiv Bugs 81184: x86 JIT CQ:
// Removing the inline striction of "starg".
int value_copy = value;
if (value_copy >= 0) {
flags = 0;
}
else {
flags = SignMask;
value_copy = -value_copy;
}
lo = value_copy;
mid = 0;
hi = 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,Decimal结构的构造函数将方法参数复制到局部变量,而不是直接使用它.我想知道评论的含义以及它与性能和优化的关系?
我的猜测是,一旦你想修改现有的参数,方法就不能再内联了?
http://referencesource.microsoft.com/#mscorlib/system/decimal.cs#f9a4da9d6e110054#references
我有一个用Java 8编写的相当简单的业余爱好项目,它在其一种操作模式中广泛使用重复的Math.round()调用.例如,一个这样的模式产生4个线程,并通过ExecutorService对48个可运行的任务进行排队,每个任务运行类似于下面的代码块2 ^ 31次:
int3 = Math.round(float1 + float2);
int3 = Math.round(float1 * float2);
int3 = Math.round(float1 / float2);
Run Code Online (Sandbox Code Playgroud)
这不完全是如何(涉及数组和嵌套循环),但你明白了.无论如何,在Java 8u40之前,类似于上述代码的代码可以在AMD A10-7700k上在大约13秒内完成大约1030亿个指令块的全部运行.使用Java 8u40,执行相同的操作大约需要260秒.代码没有变化,没有任何变化,只是Java更新.
有没有人注意到Math.round()变得慢得多,特别是当它被重复使用时?几乎就好像JVM正在进行某种优化之前它已经不再做了.也许它是在8u40之前使用SIMD而现在不是?
编辑:我已经完成了对MVCE的第二次尝试.你可以在这里下载第一次尝试:
https://www.dropbox.com/s/rm2ftcv8y6ye1bi/MathRoundMVCE.zip?dl=0
第二次尝试如下.我的第一次尝试已经从这篇文章中删除,因为它被认为太长了,并且很容易被JVM去掉代码去除(显然在8u40中发生的事情更少).
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MathRoundMVCE
{
static long grandtotal = 0;
static long sumtotal = 0;
static float[] float4 = new float[128];
static float[] float5 = new float[128];
static int[] int6 = new int[128];
static int[] int7 = new int[128];
static int[] int8 = new int[128];
static long[] longarray = …Run Code Online (Sandbox Code Playgroud) 在对这个答案的评论中(建议使用位移运算符而不是整数乘法/除法,为了提高性能),我询问这实际上是否会更快.在我的脑海中有一个想法,在某种程度上,某些东西将足够巧妙地解决这个问题>> 1并且/ 2是相同的操作.但是,我现在想知道这是否真的是真的,如果是,它会发生在什么级别.
测试程序optimize为两种方法产生以下比较CIL(带有on),分别对其参数进行划分和移位:
IL_0000: ldarg.0
IL_0001: ldc.i4.2
IL_0002: div
IL_0003: ret
} // end of method Program::Divider
Run Code Online (Sandbox Code Playgroud)
与
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: shr
IL_0003: ret
} // end of method Program::Shifter
Run Code Online (Sandbox Code Playgroud)
所以C#编译器正在发出div或shr指示,而不是聪明.我现在想看看JITter生成的实际x86汇编程序,但我不知道如何执行此操作.它甚至可能吗?
编辑添加
感谢您的回答,已接受来自nobugz的那个,因为它包含有关该调试器选项的关键信息.最终对我有用的是:
Tools | Options | Debugger,关闭'抑制模块负载上的JIT优化'(即我们希望允许 JIT优化)Debugger.Break()某处发表声明至少可以说结果很有启发性 - 事实证明JITter实际上可以做算术!这是来自"反汇编"窗口的已编辑样本.各种-Shifter方法除以2的幂>>; 各种-Divider …
我是一个在开发机器上使用Windows 7的新手,我有一个在启动时崩溃的开发工具,我没有看到它抛出的任何错误消息,或者有机会调试它,因为它显示了崩溃程序的Windows 7对话框,其中显示"Windows正在检查解决方案......"
我想让我的旧学校大屁股断言对话框,带有一个大的"DEBUG"按钮.我在Visual Studio的选项和设置中完全启用了JIT,所以我不确定为什么我没有得到该选项.
HotSpot的分层编译使用解释器,直到调用(对于方法)或迭代(对于循环)的阈值触发具有自分析的客户端编译.使用客户端编译,直到另一个调用或迭代阈值触发服务器编译.
打印HotSpot的标志使用-XX:+ TieredCompilation显示以下标志值.
intx CompileThreshold = 10000 {pd product}
intx Tier2CompileThreshold = 0 {product}
intx Tier3CompileThreshold = 2000 {product}
intx Tier4CompileThreshold = 15000 {product}
Run Code Online (Sandbox Code Playgroud)
仅有客户端和服务器编译器的标志太多.哪些编译器由这些标志控制?如果不是客户端和服务器,其他编译器的目的是什么?
在这种情况下是否忽略CompileThreshold和Tier2CompileThreshold?触发客户端编译时Tier3CompileThreshold控制什么?触发服务器编译时Tier4CompileThreshold控制什么?
我试图重现这里描述的一些处理器缓存效果.我知道Java是一个托管环境,这些例子不会完全翻译,但我遇到了一个奇怪的例子,我试图提炼出一个简单的例子来说明效果:
public static void main(String[] args) {
final int runs = 10;
final int steps = 1024 * 1024 * 1024;
for (int run = 0; run < runs; run++) {
final int[] a = new int[1];
long start = System.nanoTime();
for (int i = 0; i < steps; i++) {
a[0]++;
}
long stop = System.nanoTime();
long time = TimeUnit.MILLISECONDS.convert(stop - start, TimeUnit.NANOSECONDS);
System.out.printf("Time for loop# %2d: %5d ms\n", run, time);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Time for loop# …Run Code Online (Sandbox Code Playgroud) jit ×10
java ×3
performance ×3
.net ×2
c# ×2
optimization ×2
browser ×1
c++ ×1
cil ×1
decimal ×1
ios ×1
javascript ×1
jvm ×1
jvm-hotspot ×1
llvm ×1
llvm-ir ×1
webkit ×1
windows-7 ×1