小编Den*_*voy的帖子

JIT编译器的IL优化

我正在开发一个发出IL代码的编译器.重要的是,由Mono和Microsoft .NET JIT编译器对生成的IL进行JIT,以获得最快的机器代码.

我的问题是:

  1. 优化模式是否有意义:

    'stloc.0; ldloc.0; ret' => 'ret' 
    'ldc.i4.0; conv.r8' => 'ldc.r8.0'
    
    Run Code Online (Sandbox Code Playgroud)

    等等,或JIT是否足够聪明,可以照顾这些?

  2. 是否有Microsoft/Mono JIT编译器执行的优化列表的规范?

  3. 是否有任何良好的读物与实际建议/最佳实践来优化IL,以便JIT编译器可以反过来生成最佳的机器代码(性能方面)?

.net c# il jit

13
推荐指数
2
解决办法
446
查看次数

检测双精度是否有限的最快方法是什么?

double在没有抛出异常的情况下,在IL中检测值是否为有限值(NaN和正/负无穷大)的最快方法是什么?

我正在考虑以下方法(仅为了方便读者使用c#表示法,在我的项目中,我使用的是IL):

  1. !double.IsNaN(x) && !double.IsInfinity(x) - 最明显的,也可能是最慢的,因为涉及2个方法调用.

  2. (*(((long*) &x)) & 0x7fffffffffffffffL) < 0x7ff0000000000000L

或在IL:

  ldloca x
  conv.u 
  ldind.i8 
  ldc.i8 0x7fffffffffffffff
  and 
  ldc.i8 0x7ff0000000000000
  clt 
Run Code Online (Sandbox Code Playgroud)

我对第二种方法的问题是:

  1. 根据我的研究,这应该精确地确定任何给定是否x是有限的.这是真的?

  2. 它是解决IL中任务的最佳方式(性能方面),还是有更好(更快)的解决方案?

PS我非常感谢建议运行我自己的基准并找出答案,并且肯定会这样做.只是想到也许有人已经有类似的问题,并知道答案.PPS是的,我意识到我们在这里谈论的是纳秒,是的,它们对我的具体情况很重要

.net c# il

6
推荐指数
1
解决办法
1414
查看次数

在将 Rx 事件提供给订阅者之前和之后修改 C# 中的 Rx 事件

每次观察到事件时,我都需要对其进行预处理和后处理。这是我想出的东西,它有效:

var subj = new Subject<Event>();
var observable = Observable.Create<Event>(obs =>
{
    subj.Finally(obs.OnCompleted); 
    return subj.Subscribe(e =>
    {
        try
        {
            Preprocess(e);
            obs.OnNext(e);
            Postprocess(e);
        }
        catch (Exception ex) { obs.OnError(ex); }
    });
});
Run Code Online (Sandbox Code Playgroud)

我的问题:这是正确的方法,还是有更好的模板/扩展方法?

c# system.reactive

3
推荐指数
1
解决办法
191
查看次数

标签 统计

c# ×3

.net ×2

il ×2

jit ×1

system.reactive ×1