例如,在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)
可能是一个菜鸟问题并且之前一直有人问过,但是找不到参考.
我曾经是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) 我正在开发一个发出IL代码的编译器.重要的是,由Mono和Microsoft .NET JIT编译器对生成的IL进行JIT,以获得最快的机器代码.
我的问题是:
优化模式是否有意义:
'stloc.0; ldloc.0; ret' => 'ret'
'ldc.i4.0; conv.r8' => 'ldc.r8.0'
Run Code Online (Sandbox Code Playgroud)
等等,或JIT是否足够聪明,可以照顾这些?
是否有Microsoft/Mono JIT编译器执行的优化列表的规范?
是否有任何良好的读物与实际建议/最佳实践来优化IL,以便JIT编译器可以反过来生成最佳的机器代码(性能方面)?
后随以不.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++编译器肯定似乎做了这个优化,所以我想知道为什么会出现这种差异.有任何想法吗?
向公众分发Debugvs Release构建是否存在任何安全性或性能问题?
大多数时候,我只是将.exe文件打包在Debug文件夹中(以及所需的依赖项)并将其提供给用户.
是否有理由更喜欢分发一个而不是另一个?
码:
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) 我正在尝试构建一个代码示例,以便在乘以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) 在svc文件中设置Debug ="true"会有性能损失吗?是否足以保证在生产环境中将其设置为"假"?
%@ ServiceHost Language="C#" **Debug="true"** Service="AwesomeService" %>
Run Code Online (Sandbox Code Playgroud)
谢谢
我听说在Release模式下编译生成的优化代码比在Debug模式下生成,这很好.
但这是IL的优化吗?一旦CLR运行它,它在机器代码中吗?是否与在Release和Debug中编译的PE不同的元数据结构?
谢谢
可能重复:
调试/版本差异
调试版本和发布版本之间的性能差异
在调试模式VS发布模式下编译和运行asp.net/c#项目有何不同?