相关疑难解决方法(0)

C#是否在循环/ lambda语句中自动优化代码?

例如,在Javascript中,强烈建议人们在循环之外放置函数调用以获得更好的性能:

var id = someIdType.ToString();
someList.Where(a => a.id == id) ...
Run Code Online (Sandbox Code Playgroud)

C#怎么样?同样的情况还是编译器/运行时采用内部优化/缓存?

someList.Where(a => a.id == someIdType.ToString()) ...
Run Code Online (Sandbox Code Playgroud)

可能是一个菜鸟问题并且之前一直有人问过,但是找不到参考.

c#

14
推荐指数
2
解决办法
1482
查看次数

C#vs C++三元运算符

我曾经是Windows上的C++程序员.我知道编译器会优化C++中的三元运算符.

C++代码:

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    int result = argc > 3 ? 1 : 5;
    printf("%d", result);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于管道内容,生成的本机代码如下所示(当然是Release模型):

int result = argc > 3 ? 1 : 5;
00B21003  xor         eax,eax  
00B21005  cmp         dword ptr [argc],3
00B21009  setle       al  
00B2100C  lea         eax,[eax*4+1]
Run Code Online (Sandbox Code Playgroud)

C#代码:

namespace TernaryOperatorCSharp
{
    static void Main(string[] args)
    {
        int argc = args.Length;
        int result = argc > 1 ? 2 : 5;
        System.Console.WriteLine(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

我查找了生成的本机代码JIT,但根本没有优化(仍然是两个跳转指令).

int …
Run Code Online (Sandbox Code Playgroud)

c# c++ ternary-operator

13
推荐指数
1
解决办法
546
查看次数

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
查看次数

有没有办法让.Net JIT或C#编译器优化掉空的for循环?

后随以不.NET JIT优化空循环走?:

以下程序只运行十亿次空循环并打印出运行时间.我的机器需要700毫秒,我很好奇是否有办法让抖动优化掉空循环.

using System;

namespace ConsoleApplication1 {
    class Program {
        static void Main() {
            var start = DateTime.Now;
            for (var i = 0; i < 1000000000; i++) {}
            Console.WriteLine((DateTime.Now - start).TotalMilliseconds);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,答案是否定的,但我不知道是否有隐藏的编译器选项,我可能没试过.我确保在发布模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒才能运行此空循环.我也试过NGEN同样的结果(虽然我的理解是它应该生成与JIT相同的编译代码,对吧?).但是我之前从未使用过NGEN,可能使用错了.

看起来像这将是一些容易的JIT发现和优化掉,但是了解甚少抖动一般是如何工作的,我很好奇,如果有这种优化将遭到冷落具体原因.VC++编译器肯定似乎做了这个优化,所以我想知道为什么会出现这种差异.有任何想法吗?

.net c# clr jit compiler-optimization

11
推荐指数
1
解决办法
783
查看次数

优化.net时的调试与发布(分发给用户时的问题)

向公众分发Debugvs Release构建是否存在任何安全性或性能问题?

大多数时候,我只是将.exe文件打包在Debug文件夹中(以及所需的依赖项)并将其提供给用户.

是否有理由更喜欢分发一个而不是另一个?

.net c# vb.net visual-studio

10
推荐指数
2
解决办法
2167
查看次数

相同代码块执行的持续时间如此不同的原因是什么?

码:

 internal class Program
{
    private static void Main(string[] args)
    {
        const int iterCount = 999999999;

        var sum1 = 0;
        var sum2 = 0;

        using (new Dis())
        {
            var sw = DateTime.Now;
            for (var i = 0; i < iterCount; i++)
                sum1 += i;
            Console.WriteLine(sum1);
            Console.WriteLine(DateTime.Now - sw);
        }

        using (new Dis())
        {
            var sw = DateTime.Now;
            for (var i = 0; i < iterCount; i++)
                sum2 += i;
            Console.WriteLine(sum2);
            Console.WriteLine(DateTime.Now - sw);
        }

        Console.ReadLine();
    }

    private class Dis : …
Run Code Online (Sandbox Code Playgroud)

.net c# .net-core

10
推荐指数
1
解决办法
206
查看次数

什么时候编译器优化我的代码

我正在尝试构建一个代码示例,以便在乘以2的幂时,显示编译器对代码的优化.然而,当我转向优化代码时,IL仍然主要是相同的.我在这里做错了什么想法?

代码:

int nr;
int result;
var stopwatch = new Stopwatch();

nr = 5;

stopwatch.Start();
    result = nr * 4;
stopwatch.Stop();

Console.WriteLine(result);
Console.WriteLine(stopwatch.Elapsed.ToString() + "ms ellapsed");
stopwatch.Reset();

stopwatch.Start();
result = nr << 2;
stopwatch.Stop();

Console.WriteLine(result);
Console.WriteLine(stopwatch.Elapsed.ToString() + "ms ellapsed");
Run Code Online (Sandbox Code Playgroud)

非优化IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       130 (0x82)
  .maxstack  2
  .locals init ([0] int32 nr,
           [1] int32 result,
           [2] class [System]System.Diagnostics.Stopwatch stopwatch,
           [3] valuetype [mscorlib]System.TimeSpan CS$0$0000,
           [4] valuetype [mscorlib]System.TimeSpan CS$0$0001)
  IL_0000: …
Run Code Online (Sandbox Code Playgroud)

c# compiler-optimization visual-studio

9
推荐指数
2
解决办法
417
查看次数

@ServiceHost Debug ="true" - 性能损失?

在svc文件中设置Debug ="true"会有性能损失吗?是否足以保证在生产环境中将其设置为"假"?

%@ ServiceHost Language="C#" **Debug="true"** Service="AwesomeService" %>
Run Code Online (Sandbox Code Playgroud)

谢谢

.net performance wcf svc

9
推荐指数
1
解决办法
3853
查看次数

正在编译Release和Debug会生成不同的IL代码+不同的机器代码吗?

我听说在Release模式下编译生成的优化代码比在Debug模式下生成,这很好.

但这是IL的优化吗?一旦CLR运行它,它在机器代码中吗?是否与在Release和Debug中编译的PE不同的元数据结构?

谢谢

.net c# vb.net .net-framework-version csc

9
推荐指数
1
解决办法
867
查看次数

8
推荐指数
1
解决办法
4万
查看次数