是否存在JIT编译器比其他编译器(如C++)更快的情况?
您认为将来JIT编译器只会看到次要的优化,功能但是会遵循类似的性能,还是会有突破性的优势使其无限优于其他编译器?
看起来多核心范式有一些希望,但它不是普遍的魔力.
任何见解?
微软最近发布了新的Phone 7平台的工具和文档,让那些拥有大型C++代码库的人(比如我)感到沮丧,不再支持本机开发了.虽然我发现有关这一决定被推翻的猜测,但我对此表示怀疑.所以我想通过调整它在C++/CLI下进行编译来使Phone 7可用的代码库是多么可行.当然用户界面部件无法移植,但我不确定其余部分.有人有类似的经历吗?我不是在谈论那些做重度低级的东西的代码 - 但是经常使用模板和智能指针.
我最近发现可以使用编译器包使用JIT(及时)使用R编译(我在最近的博客文章中总结了我对此主题的发现).
我被问到的一个问题是:
有任何陷阱吗?这听起来好得令人难以置信,只需输入一行代码即可.
环顾四周后,我发现一个可能的问题与JIT的"启动"时间有关.但是在使用JIT时还有其他问题需要注意吗?
我想与R的环境架构有一些限制,但我想不出一个简单的问题,我的头脑问题,任何建议或危险信号将有很大的帮助?
在最近升级到.net 4.6之后,我们发现了一个RyuJit产生错误结果的错误,我们现在可以通过在app.config中添加useLegacyJit enabled ="true"来解决这个问题.
如何调试以下生成的机器代码?
我在VS 2015 RTM中创建了一个新的控制台项目,设置为Release,Any CPU,未经检查的Prefer 32 bit,带有和不带调试器的运行产生相同的结果.
using System;
using System.Runtime.CompilerServices;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculate());
Console.WriteLine(Calculate());
Console.ReadLine();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Value Calculate()
{
bool? _0 = (bool?)null;
bool? _1 = (bool?)true;
if (!Value.IsPresent<bool>(_1))
{
return default(Value);
}
bool? result = null;
result = (_1.Value ? new bool?(false) : result);
if (_0.HasValue && _0.Value)
{
}
return new Value(result);
}
public struct Value
{
bool? _value;
public Value(bool? …Run Code Online (Sandbox Code Playgroud) Just-in-Time-Compiler和Interpreter之间有什么区别,.NET和Java JIT编译器之间有区别吗?
在发布模式(或启用优化的调试)中构建时,以下代码的行为会有所不同,并且在未附加Visual Studio调试器的情况下运行.
如果使用x86 JITter,它似乎也只能复制.我在x86机器上测试了这个,并在x64机器上运行WOW64(通过将Platform目标设置为x86).
我只用.NET 4.0试过这个.
在Release I中在调试器外部运行时,请参阅:
Value is 4
Run Code Online (Sandbox Code Playgroud)
当在调试器内运行e.Value.Length时,WriteLine调用的部分抛出NullReferenceException,这是我预期会发生的.
代码:
namespace Test
{
class UsingReleasable<T>
{
public UsingReleasable(T obj)
{
m_obj = obj;
}
public T Release()
{
T tmp = m_obj;
m_obj = default(T);
return tmp;
}
public T Value
{
get { return m_obj; }
}
T m_obj;
}
class Program
{
static void Main(string[] args)
{
var e = new UsingReleasable<string>("test");
e.Release();
System.Console.WriteLine("Value is …Run Code Online (Sandbox Code Playgroud) 为什么.NET 4.0中的C#方法即时编译的顺序会影响它们执行的速度?例如,考虑两种等效方法:
public static void SingleLineTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int count = 0;
for (uint i = 0; i < 1000000000; ++i) {
count += i % 16 == 0 ? 1 : 0;
}
stopwatch.Stop();
Console.WriteLine("Single-line test --> Count: {0}, Time: {1}", count, stopwatch.ElapsedMilliseconds);
}
public static void MultiLineTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int count = 0;
for (uint i = 0; i < 1000000000; ++i) {
var isMultipleOf16 = i % …Run Code Online (Sandbox Code Playgroud) 我只是在观看Google IO视频,他们谈到了他们在android中包含的JIT编译器.由于JIT编译器,他们展示了性能改进的演示.我想知道JIT编译器究竟做了什么,想要听取不同的人的意见.
那么,JIT编译器的职责是什么?
我认为JIT编译器最终将在编译代码的性能方面击败AOT编译器,因为JIT具有固有的优势(可以使用仅在运行时可用的信息).一个论点是AOT编译器可以花更多时间编译代码,但服务器VM也可能花费大量时间.
我知道JIT确实在某些情况下击败了AOT编译器,但在大多数情况下它们似乎仍然落后.
所以我的问题是,阻止JIT编译器击败AOT编译器的具体而棘手的问题是什么?
编辑:
一些常见的论点:
另一个编辑:
有关具体示例,请参阅此文章:改进Swing性能:JIT与AOT编译.从我从本文中可以收集的内容来看,作者基本上说当没有热点时,运行时信息的优势会降低,因此没有JIT开销的AOT就会获胜.但是40%?这似乎没有多大意义.仅仅是因为这种情况没有调整被比较的JIT编译器吗?还是更基本的东西?
我得到了下面的汇编列表作为我的java程序的JIT编译的结果.
mov 0x14(%rsp),%r10d
inc %r10d
mov 0x1c(%rsp),%r8d
inc %r8d
test %eax,(%r11) ; <--- this instruction
mov (%rsp),%r9
mov 0x40(%rsp),%r14d
mov 0x18(%rsp),%r11d
mov %ebp,%r13d
mov 0x8(%rsp),%rbx
mov 0x20(%rsp),%rbp
mov 0x10(%rsp),%ecx
mov 0x28(%rsp),%rax
movzbl 0x18(%r9),%edi
movslq %r8d,%rsi
cmp 0x30(%rsp),%rsi
jge 0x00007fd3d27c4f17
Run Code Online (Sandbox Code Playgroud)
我对这test条指令的理解在这里没用,因为测试的主要思想是
标志SF,ZF,PF被修改,而AND的结果被丢弃.
这里我们不使用这些结果标志.
这是JIT中的错误还是我错过了什么?如果是,报告的最佳位置在哪里?谢谢!