C# 元组,构造-解构性能
C# tuples, construction-deconstruction performance
我一直在按照以下风格编写一些代码:
a1 = b1;
a2 = b2;
a3 = b3;
...
an = bn;
突然我意识到,对于我来说,对于我正在编写当前算法 (...) 的上下文,以以下形式编写其中一些作业在美学上更令人愉悦:
(a1, a2, a3, ..., an) = (b1, b2, b3, ..., bn);
现在,我想知道这种编写代码的方式对性能的影响。我想在这里元组的构造-解构可以被编译器优化掉。但也许不是?请注意,b1、b2、...、bn 可以是值或表达式。而且,如果无法进行优化,n 的大小将很重要(我认为)。
所以,有一个具体的问题:有人可以解释一下这两种编写代码的性能差异,同时考虑到所有可能的细节吗?
提前致谢。
像这样使用,它们根本就不是 ValueTuple
,因为编译器已经把它全部去掉了。
比较和对比IL:
var a = 1;
var b = 2;
var c = 3;
var d = 4;
去
IL_0001: ldc.i4.1
IL_0002: stloc.0 // a
IL_0003: ldc.i4.2
IL_0004: stloc.1 // b
IL_0005: ldc.i4.3
IL_0006: stloc.2 // c
IL_0007: ldc.i4.4
IL_0008: stloc.3 // d
和
var (a, b, c, d) = (1, 2, 3, 4);
前往:
IL_0001: ldc.i4.1
IL_0002: stloc.0 // a
IL_0003: ldc.i4.2
IL_0004: stloc.1 // b
IL_0005: ldc.i4.3
IL_0006: stloc.2 // c
IL_0007: ldc.i4.4
IL_0008: stloc.3 // d
一样。
所以...一旦编译器发挥了它的魔力,它实际上只是一种样式选择。
我一直在按照以下风格编写一些代码:
a1 = b1;
a2 = b2;
a3 = b3;
...
an = bn;
突然我意识到,对于我来说,对于我正在编写当前算法 (...) 的上下文,以以下形式编写其中一些作业在美学上更令人愉悦:
(a1, a2, a3, ..., an) = (b1, b2, b3, ..., bn);
现在,我想知道这种编写代码的方式对性能的影响。我想在这里元组的构造-解构可以被编译器优化掉。但也许不是?请注意,b1、b2、...、bn 可以是值或表达式。而且,如果无法进行优化,n 的大小将很重要(我认为)。
所以,有一个具体的问题:有人可以解释一下这两种编写代码的性能差异,同时考虑到所有可能的细节吗?
提前致谢。
像这样使用,它们根本就不是 ValueTuple
,因为编译器已经把它全部去掉了。
比较和对比IL:
var a = 1;
var b = 2;
var c = 3;
var d = 4;
去
IL_0001: ldc.i4.1
IL_0002: stloc.0 // a
IL_0003: ldc.i4.2
IL_0004: stloc.1 // b
IL_0005: ldc.i4.3
IL_0006: stloc.2 // c
IL_0007: ldc.i4.4
IL_0008: stloc.3 // d
和
var (a, b, c, d) = (1, 2, 3, 4);
前往:
IL_0001: ldc.i4.1
IL_0002: stloc.0 // a
IL_0003: ldc.i4.2
IL_0004: stloc.1 // b
IL_0005: ldc.i4.3
IL_0006: stloc.2 // c
IL_0007: ldc.i4.4
IL_0008: stloc.3 // d
一样。
所以...一旦编译器发挥了它的魔力,它实际上只是一种样式选择。