コンパイルした場合、両方のループが空のボディを持っています!それを防ぐために、そしてより現実的なコードの中で何が起こるかを示すために、そのようにそれをテスト
第2のループ振る舞いをするために、あなたは(object)
が
をキャスト削除する必要があります、これは私はあなたのコードをコンパイルするとき、それがどのように見えるかで、
public struct MyStruct
{
}
class Program
{
static void Main(string[] args)
{
test1();
test2();
}
public static void test1()
{
Stopwatch sw = new Stopwatch();
bool b;
MyStruct s;
for (int i = 0; i < 100000000; i++)
{
b = (object)s == null;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
public static void test2()
{
Stopwatch sw = new Stopwatch();
bool b;
MyStruct? s = null;
for (int i = 0; i < 100000000; i++)
{
b = (object)s == null;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
IL:
体mystruct (あなたが何も提供しなかったので空です)
.class public sequential ansi sealed beforefieldinit ConsoleApplication1.MyStruct
extends [mscorlib]System.ValueType
{
.pack 0
.size 1
} // end of class ConsoleApplication1.MyStruct
あなたの例では、Tループ
.method public hidebysig static
void test1() cil managed
{
// Method begins at RVA 0x2054
// Code size 17 (0x11)
.maxstack 2
.locals init (
[0] valuetype ConsoleApplication1.MyStruct s,
[1] int32 i
)
IL_0000: ldc.i4.0
IL_0001: stloc.1
IL_0002: br.s IL_0008
// loop start (head: IL_0008)
IL_0004: ldloc.1
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: stloc.1
IL_0008: ldloc.1
IL_0009: ldc.i4 100000000
IL_000e: blt.s IL_0004
// end loop
IL_0010: ret
} // end of method Program::test1
第二のループ
.method public hidebysig static
void test2() cil managed
{
// Method begins at RVA 0x2074
// Code size 25 (0x19)
.maxstack 2
.locals init (
[0] valuetype [mscorlib]System.Nullable`1<valuetype ConsoleApplication1.MyStruct> s,
[1] int32 i
)
IL_0000: ldloca.s s
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<valuetype ConsoleApplication1.MyStruct>
IL_0008: ldc.i4.0
IL_0009: stloc.1
IL_000a: br.s IL_0010
// loop start (head: IL_0010)
IL_000c: ldloc.1
IL_000d: ldc.i4.1
IL_000e: add
IL_000f: stloc.1
IL_0010: ldloc.1
IL_0011: ldc.i4 100000000
IL_0016: blt.s IL_000c
// end loop
IL_0018: ret
} // end of method Program::test2
このコードはコンパイルされません。エラー1 2番目のループに割り当てられていないローカル変数 's'の使用 – Fredou
@Fredouそうです。実際にはタイプミス。私はいくつかのベンチマークで私の答えを更新します - 私は自分のタイミングで間違いを見つけました – nawfal
このコードは、コンパイルされたときに空のループを実行しているようですが、7500msを得る方法がわからないので実際のベンチマークコードを投稿する必要があります – Fredou