我正在使用LLVM C++ API.我想JIT编译代码并运行它.
但是,我需要从所述JIT编译的代码中调用C++方法.通常,LLVM将方法调用视为函数调用,并将对象指针作为第一个参数传递,因此调用不应该是一个问题.真正的问题是将该功能转换为LLVM.
据我所知,可以使用外部链接功能,并通过其名称获取它.问题是,因为它是一个C++方法,它的名字会被破坏,所以我不认为这样做是个好主意.
使FunctionType对象很容易.但是从那里,我如何通知LLVM我的方法并Function为它获取一个对象?
下面的代码运行完全相同的计算3次(它没有做太多:基本上添加从1到100米的所有数字).前两个块的运行速度比第三个块快约10倍.我已经运行了这个测试程序超过10次,结果显示非常小的差异.
如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是:
35974537
36368455
296471550
有人能解释一下发生了什么吗?(为了清楚起见,我不是想在这里修改任何东西,只是想更好地了解发生了什么)
注意:
-XX:+PrintGC)-XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m=>相同的结果public static void main(String... args) {
//three identical blocks
{
long start = System.nanoTime();
CountByOne c = new CountByOne();
int sum = 0;
for (int i = 0; i < 100000000; i++) {
sum += c.getNext();
}
if (sum != c.getSum()) throw new IllegalStateException(); //use sum
long end = System.nanoTime();
System.out.println((end - start));
}
{
long start = System.nanoTime();
CountByOne …Run Code Online (Sandbox Code Playgroud) 当我们知道它不会改变太多时,使用NGEN和ASP.NET应用程序是否更好?或者JIT足够好吗?
我问的唯一原因是因为Jeffrey Richter在2002年的这篇文章说:
当然,Microsoft正在努力改进CLR及其JIT编译器,以便它运行得更快,生成更优化的代码,并更有效地使用内存.这些改进需要时间.对于不能等待的开发人员,.NET Framework可再发行组件包含一个名为NGen.exe的实用程序.
我不明白LLVM JIT如何与正常的无JIT编译相关,文档也不好.
例如,假设我使用clang前端:
这两者有什么区别,是否正确?LLVM流程是否包括对JIT和非JIT的支持?我什么时候想使用JIT - 对于像C这样的语言来说它有意义吗?
我正在编写一个LLVM脚本引擎,JIT用自定义语言编写脚本代码.我的问题是我无法调用外部函数(即使C99 erf()函数失败).
例如,如果我extern"C"erf函数,
extern "C" double erft(double x){
return erf(x);
}
Run Code Online (Sandbox Code Playgroud)
并创建一个外部链接功能
std::vector<const Type*> Double1(1,Type::getDoubleTy(getGlobalContext()));
FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),Double1,false);
Function *erft = Function::Create(FT,Function::ExternalLinkage,"erft",TheModule);
Run Code Online (Sandbox Code Playgroud)
使用erft(0.0)运行脚本时出现以下错误消息:
LLVM错误:程序使用的外部功能'erft'无法解决!
手动执行映射,
void ExecutionEngine::addGlobalMapping( const GlobalValue * erfF, void * erft);
Run Code Online (Sandbox Code Playgroud)
会得到以下错误:
在类之外的`void llvm :: ExecutionEngine :: addGlobalMapping(const llvm :: GlobalValue*,void*)'的声明不是定义
显然我做错了.任何帮助将非常感激
.NET 4.5的新性能增强之一是引入了"MultiCode JIT".
有关详细信息,请参见此处
我试过这个,但似乎对我的申请没有影响.
我感兴趣的原因是我的应用程序(IronScheme)需要很长时间才能启动,如果不是NGEN,这意味着启动时会涉及相当数量的JIT'ng.(NGEN时为1.4秒vs 0.1秒).
我已经按照如何启用它的说明进行操作,我可以看到创建了一个"小"(4-12KB).但是在随后的启动中,似乎对改善启动时间没有任何影响.它仍然是1.4秒.
有没有人在实践中看到(或制作过)这项工作?
此外,对哪些代码进行"跟踪"有任何限制吗?例如:集加载上下文,瞬态组件等我问这个作为创建的文件似乎永远不会长大,但我其实生成的代码中有相当(在瞬态组装).
我遇到的一个错误是,SetProfileRoot似乎不理解/作为路径分隔符,请确保使用\.
由于.NET运行时出现内部错误(退出代码0x80131506),我一直在追逐.NET服务中间歇性崩溃的原因.有问题的服务不执行任何通常应归咎于此类错误的操作(不安全代码,PInvoke等).我已尝试禁用并发GC,如KB2679415中所述,以及切换到服务器GC,但间歇性崩溃仍然存在.在调试模式下编译时,问题在.NET 4.7.2及更早版本中出现.
该服务广泛使用旧版本的NHibernate(2.0.1),当我在调试器中检查崩溃转储时,在发生错误时,callstack中总会有NHibernate代码,尽管NHibernate本身都是托管代码,所以不应该导致这种崩溃.
我已设法在调试器下重现崩溃并启用GC压力日志和堆验证,虽然它似乎指向JIT/GC中的问题,但我不确定我是否正确解释输出.
查看发生崩溃的线程,此时它发生在clr!JIT_Stelem_Ref:
clr!JIT_Stelem_Ref+0x18: cmp r9,qword ptr [r8] ds:aaaaaaaa`aaaaaaaa=????????????????
Run Code Online (Sandbox Code Playgroud)
在这种情况下,0xaas 字符串似乎是启用HeapVerify的结果,这会导致GC填充收集的内存区域,可能是为了更容易识别,并建议我们仍然有一个对收集/重定位对象的旧位置的引用.
追溯到堆栈中,有很多0xaaaaaaaaaaaaaaaa条目,但是当最近的GC发生时,这些停止出现在调用堆栈顶部的方法中,在这种情况下,NHibernate.Loader.Loader.GetRow()根据最近的GC压力日志此线程上的GC:
(注意:我已经从SOS' !dumplog输出中反转了记录行的顺序,以便于阅读):
2404 12445.672380360 : `GC`GCROOTS` Starting scan of Thread 000000001EF4DED0 ID = 20 {
2404 12445.672380963 : `GCROOTS` Scanning ExplicitFrame 000000001E6ED3B8 AssocMethod = 0000000000000000 frameVTable = 000007FEF365B640 (clr!RedirectedThreadFrame::`vftable')
2404 12445.672386397 : `GCROOTS` Scanning Frameless method 000007FE93F43460 (NHibernate.Loader.Loader.GetRow(System.Data.IDataReader, NHibernate.Persister.Entity.ILoadable[], NHibernate.Engine.EntityKey[], System.Object, NHibernate.Engine.EntityKey, NHibernate.LockMode[], System.Collections.IList, NHibernate.Engine.ISessionImplementor)) ControlPC = 000007FE945E3095
2404 12445.672388208 : `GC`GCROOTS` GC …Run Code Online (Sandbox Code Playgroud) 我目前正在Android平台上撰写论文.经过一番研究,很明显Dalvik还有改进的余地.我想知道,你觉得开发人员在这个目标上的最佳用途是什么?
JIT编译似乎是一个很大的问题,但后来我也听说过这种资源在这么低资源的机器上使用有限.有没有人有资源或数据支持这一点?
是否还有其他选择需要考虑?除了开发强大的本机开发工具包以绕过VM.
对于那些感兴趣的人,有一个关于Dalvik VM的录音和在线讲座.
任何想法都欢迎,因为这个问题似乎是主观的,我会澄清我接受的答案必须有一些理由提出修改.任何支持它的数据,例如Sun JVM引入时的改进,都将是一个巨大的优势.
可能重复:
JIT编译器与脱机编译器
我听说在某些情况下,由于JIT优化,Java程序或java程序的某些部分能够比C++(或其他预编译代码)中的"相同"代码执行得更快.这是因为编译器能够确定某些变量的范围,避免一些条件并在运行时拉出类似的技巧.
你能给出一个(或更好 - 一些)例子吗?并且可能概述了编译器能够优化字节码超出预编译代码可能性的确切条件?
注意:这个问题不是将Java与C++进行比较.它关于JIT编译的可能性.请不要燃烧.我也不知道有任何重复.如果你是的话请指出来.
在.net 4.5中有一个名为Multicore JIT的新功能
它可以提高应用启动时间的性能.
但是,您需要在代码中启用它.
那么为什么默认情况下它没有开启?