- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:我在最后添加了 ASM。
我相信学习如何在平台上编写好的代码的最好方法是试验平台,从而理解它。因此,这个问题是为了更好地理解 CLR,而不是尝试纳米优化。
尽管如此,我还是想到融合设置和评估变量这两个操作会更快。事实证明,确实如此。在下面的代码中,第二个循环的执行时间大约是第一个循环的 60%:
private sealed class Temp
{
public int val;
}
private void button13_Click(object sender, EventArgs e)
{
Temp t = new Temp();
Temp t1;
int T1 = Environment.TickCount;
for (int i = 0; i < 1000000000; i++)
{
t1 = t;
if (t1.val++ == 1000)
{
t1.val = 0;
}
}
int T2 = Environment.TickCount;
for (int i = 0; i < 1000000000; i++)
{
if ((t1 = t).val++ == 1000)
{
t1.val = 0;
}
}
int T3 = Environment.TickCount;
MessageBox.Show((T2 - T1).ToString() + Environment.NewLine +
(T3 - T2).ToString() + Environment.NewLine +
t.val.ToString());
}
{
Temp t1;
Temp t = new Temp();
int T1 = Environment.TickCount;
for (int i = 0; i < 0x3b9aca00; i++)
{
t1 = t;
if (t1.val++ == 0x3e8)
{
t1.val = 0;
}
}
int T2 = Environment.TickCount;
for (int i = 0; i < 0x3b9aca00; i++)
{
Temp temp1 = t1 = t;
if (temp1.val++ == 0x3e8)
{
t1.val = 0;
}
}
int T3 = Environment.TickCount;
string[] CS$0$0002 = new string[] { (T2 - T1).ToString(), Environment.NewLine, (T3 - T2).ToString(), Environment.NewLine, t.val.ToString() };
MessageBox.Show(string.Concat(CS$0$0002));
}
L_0000: newobj instance void DIRECT_UI.Form1/Temp::.ctor()
L_0005: stloc.0
L_0006: call int32 [mscorlib]System.Environment::get_TickCount()
L_000b: stloc.2
L_000c: ldc.i4.0
L_000d: stloc.3
L_000e: br.s L_0037
L_0010: ldloc.0
L_0011: stloc.1
L_0012: ldloc.1
L_0013: dup
L_0014: ldfld int32 DIRECT_UI.Form1/Temp::val
L_0019: dup
L_001a: stloc.s CS$0$0000
L_001c: ldc.i4.1
L_001d: add
L_001e: stfld int32 DIRECT_UI.Form1/Temp::val
L_0023: ldloc.s CS$0$0000
L_0025: ldc.i4 0x3e8
L_002a: bne.un.s L_0033
L_002c: ldloc.1
L_002d: ldc.i4.0
L_002e: stfld int32 DIRECT_UI.Form1/Temp::val
L_0033: ldloc.3
L_0034: ldc.i4.1
L_0035: add
L_0036: stloc.3
L_0037: ldloc.3
L_0038: ldc.i4 0x3b9aca00
L_003d: blt.s L_0010
L_003f: call int32 [mscorlib]System.Environment::get_TickCount()
L_0044: stloc.s T2
L_0046: ldc.i4.0
L_0047: stloc.s V_5
L_0049: br.s L_0074
L_004b: ldloc.0
L_004c: dup
L_004d: stloc.1
L_004e: dup
L_004f: ldfld int32 DIRECT_UI.Form1/Temp::val
L_0054: dup
L_0055: stloc.s CS$0$0001
L_0057: ldc.i4.1
L_0058: add
L_0059: stfld int32 DIRECT_UI.Form1/Temp::val
L_005e: ldloc.s CS$0$0001
L_0060: ldc.i4 0x3e8
L_0065: bne.un.s L_006e
L_0067: ldloc.1
L_0068: ldc.i4.0
L_0069: stfld int32 DIRECT_UI.Form1/Temp::val
L_006e: ldloc.s V_5
L_0070: ldc.i4.1
L_0071: add
L_0072: stloc.s V_5
L_0074: ldloc.s V_5
L_0076: ldc.i4 0x3b9aca00
L_007b: blt.s L_004b
L_007d: call int32 [mscorlib]System.Environment::get_TickCount()
L_0082: stloc.s T3
L_0084: ldc.i4.5
L_0085: newarr string
L_008a: stloc.s CS$0$0002
L_008c: ldloc.s CS$0$0002
L_008e: ldc.i4.0
L_008f: ldloc.s T2
L_0091: ldloc.2
L_0092: sub
L_0093: stloc.s CS$0$0003
L_0095: ldloca.s CS$0$0003
L_0097: call instance string [mscorlib]System.Int32::ToString()
L_009c: stelem.ref
L_009d: ldloc.s CS$0$0002
L_009f: ldc.i4.1
L_00a0: call string [mscorlib]System.Environment::get_NewLine()
L_00a5: stelem.ref
L_00a6: ldloc.s CS$0$0002
L_00a8: ldc.i4.2
L_00a9: ldloc.s T3
L_00ab: ldloc.s T2
L_00ad: sub
L_00ae: stloc.s CS$0$0004
L_00b0: ldloca.s CS$0$0004
L_00b2: call instance string [mscorlib]System.Int32::ToString()
L_00b7: stelem.ref
L_00b8: ldloc.s CS$0$0002
L_00ba: ldc.i4.3
L_00bb: call string [mscorlib]System.Environment::get_NewLine()
L_00c0: stelem.ref
L_00c1: ldloc.s CS$0$0002
L_00c3: ldc.i4.4
L_00c4: ldloc.0
L_00c5: ldflda int32 DIRECT_UI.Form1/Temp::val
L_00ca: call instance string [mscorlib]System.Int32::ToString()
L_00cf: stelem.ref
L_00d0: ldloc.s CS$0$0002
L_00d2: call string [mscorlib]System.String::Concat(string[])
L_00d7: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
L_00dc: pop
L_00dd: ret
t1 = t;
000000ac mov rax,qword ptr [rsp+20h]
000000b1 mov qword ptr [rsp+28h],rax
if (t1.val++ == 1000)
000000b6 mov rax,qword ptr [rsp+28h]
000000bb mov eax,dword ptr [rax+8]
000000be mov dword ptr [rsp+74h],eax
000000c2 mov eax,dword ptr [rsp+74h]
000000c6 mov dword ptr [rsp+44h],eax
000000ca mov ecx,dword ptr [rsp+74h]
000000ce inc ecx
000000d0 mov rax,qword ptr [rsp+28h]
000000d5 mov dword ptr [rax+8],ecx
000000d8 cmp dword ptr [rsp+44h],3E8h
000000e0 jne 00000000000000EE
if ((t1 = t).val++ == 1000)
0000011d mov rax,qword ptr [rsp+20h]
00000122 mov qword ptr [rsp+28h],rax
00000127 mov rax,qword ptr [rsp+20h]
0000012c mov eax,dword ptr [rax+8]
0000012f mov dword ptr [rsp+7Ch],eax
00000133 mov eax,dword ptr [rsp+7Ch]
00000137 mov dword ptr [rsp+48h],eax
0000013b mov ecx,dword ptr [rsp+7Ch]
0000013f inc ecx
00000141 mov rax,qword ptr [rsp+20h]
00000146 mov dword ptr [rax+8],ecx
00000149 cmp dword ptr [rsp+48h],3E8h
00000151 jne 000000000000015F
最佳答案
生成的 IL 对代码效率只有间接影响。工具 + 选项,调试,常规,取消勾选“在模块加载时抑制 JIT 优化”选项。即使在调试程序时,这也会启用 JIT 优化器。确保您选择了发布配置。
在 button13_Click 上设置断点。运行并单击按钮。右键单击源代码编辑器窗口并选择“Go To Assembly”。
请注意两个循环如何生成完全相同的机器代码。对于 x86 和 x64 抖动。这当然应该是这样,执行相同逻辑操作的代码应该产生相同的机器代码。一切都很好。
这并不一定意味着它将以完全相同的速度运行,尽管它经常这样做。代码对齐至关重要。
关于.net - 了解特定的 CIL/CLR 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9019991/
我正在查看 CIL 中的各种操作码,我发现了很多类似的代码,例如 Beq,Beq_S Bge,Bge_S Bgt,Bgt_S Br,Br_S 其中 S 应该是“短格式”。这意味着什么?? 最佳答案 指
查看 monodis 生成的代码,我看到对 Console.WriteLine 的调用被转换为 call void class [mscorlib]System.Console::WriteLine。
使用 Frama-C API 中定义的 Cil_datatypes 模块,我尝试用谓词 (Cil_datatype) 中的新术语替换术语 (Cil_datatype)。为此,我需要使用一个函数映射一个
由于各种原因,我正在学习 CIL,似乎类的定义通常类似于: .class public auto ansi beforefieldinit [...] extends [mscorlib]Syste
在 Microsoft IL 中,要对值类型调用方法,您需要间接引用。假设我们有一个名为“il”的 ILGenerator 并且当前我们在堆栈顶部有一个 Nullable,如果我们想检查它是否有值,那
让我们假设以下 CIL 程序: .assembly extern mscorlib {} .assembly Program {} .method private static void Main()
这可能是一个基本问题,但是CIL的含义是什么? 我知道CIL是与平台和CPU无关的中间语言,但是 有人对此进行了解释以及CPU不可知论的含义将对您有所帮助。 最佳答案 如果是platform agno
我对值类型和 CIL 评估堆栈有点困惑。 ECMA-335, Partition III, §1.1 说 CLI 处理这些“基本 CLI 类型”: A subset of the full numer
如果应用程序采用 MSIL 格式,为什么 Visual Studio 会将应用程序编译为可执行文件?不应该像java那样把代码编译成.class文件吗? 最佳答案 .NET“可执行文件”实际上是一个很
是否有任何可读的最新(.net 4)MSIL 引用手册? 最佳答案 有一堆可下载的引用文档here . 包括 2006 年 6 月的 ECMA-335 公共(public)语言基础结构文档 (pdf)
.Net 运行时是否对 CIL 指令的原子性做出任何保证?如果是这样,它们是什么?所有 CIL 指令都是原子的吗?或者它是否取决于 JIT 编译器生成的机器代码的原子性,因此太特定于平台而无法做出任何
我有一个基于自定义堆栈的语言,我正在尝试将其编译为 CIL,以便可以对其进行 JIT 编译。该语言本身相当简单,因为它只有整数和 bool 值。然而,每种数据类型都有一个专用的堆栈。该语言本身是一个命
假设我的解决方案中有一个 C# Windows 类库,我在 VS2010 IDE 中构建它。我的 bin 目录中的输出是 X.dll 1) X.dll现阶段不包含MSIL,而是“压缩字节码”。 这是真
是否有任何 .NET CIL(又名 MSIL)ANTLR 语法? 最佳答案 根据this publication , Microsoft 在Microsoft Visual Studio 安装文件as
什么是获得可移植可执行文件的良好、人类可读形式的 CLI 的好程序?我不想要一个完整的反汇编程序,因为我想了解它们的工作原理(或者,就我而言,不工作)。 最佳答案 我推荐reflector . 它可以
我可以将指令编译为字节码,甚至可以轻松执行它们,但我发现提取 CIL 的唯一函数是 GetILAsByteArray,顾名思义,它只返回字节而不是 CIL 指令。 那么如何在 .NET 上以编程方式反
我理解以下 C# 代码: var evens = from n in nums where n % 2 == 0 select n; 编译为: var evens = nums.Where(n =>
尝试使用 ildasm 深入研究 CIL 代码,很明显 CIL 本身正在基于堆栈工作以支持如下表达式 IL_0001: ldc.i4.s 13 ; 1f 0d IL_0003: s
我在 CIL 中定义了一个字段,如下所示: .field public int32 modopt(void*) fld 我把它编译成一个程序集。现在我把它改成: .field public int32
是否可以编写将任何类型(值和引用)的实例转换为 System.String 的通用 CIL 指令? 特别是,我对将这些指令注入(inject)方法的 Mono.Cecil 代码感兴趣。 分析一个通用方
我是一名优秀的程序员,十分优秀!