C# 打开元组还是保持原样?

C# 打开元组还是保持原样?,c#,performance,tuples,C#,Performance,Tuples,处理Tuple的展开并使用几个变量而不是仅仅使用Tuple会更快吗考虑以下示例: Tuple<int,int> test = new Tuple<int,int>; int numberOne = int.Parse(Console.Readline()); int numberTwo = int.Parse(Console.Readline()); test.Item1 = numberOne; test.Item2 = numberTwo; for(int i

处理
Tuple
的展开并使用几个变量而不是仅仅使用
Tuple
会更快吗
考虑以下示例:

Tuple<int,int> test = new Tuple<int,int>;

int numberOne = int.Parse(Console.Readline());
int numberTwo = int.Parse(Console.Readline());

test.Item1 = numberOne;
test.Item2 = numberTwo;

for(int i = 0; i < 10; i++)
{
    if(test.Item1 * i > test.Item2 * i)
    {// do stuff}
    else
    {// do stuff}
}
元组测试=新元组;
int numberOne=int.Parse(Console.Readline());
int numberTwo=int.Parse(Console.Readline());
test.Item1=编号;
test.Item2=编号wo;
对于(int i=0;i<10;i++)
{
如果(test.Item1*i>test.Item2*i)
{///做事}
其他的
{///做事}
}
VS

元组测试=新元组;
int numberOne=int.Parse(Console.Readline());
int numberTwo=int.Parse(Console.Readline());
test.Item1=编号;
test.Item2=编号wo;
对于(int i=0;i<1000;i++)
{
int tempItem1=test.Item1;
int tempItem2=test.Item2;
如果(tempItem1*i>tempItem2*i)
{///做事}
其他的
{///做事}
}
我还想知道使用2个变量展开
元组是否比使用item1和item2更快。如果我们使用两个以上的变量,结果还会一样吗


提前感谢

两个版本都将元组项从内存加载到临时值中。唯一的区别是它是IL执行堆栈上的临时文件还是实际的IL本地文件。通常,这应该在JIT的范围内

如果这是一个C编译器,它将100%确定性能是相同的。任何不是这样的情况都将是一个bug


NET JIT的优化器非常差,因此您可能总是运气不好,陷入优化器的漏洞。

担心这一级别的性能差异是完全没有意义的。编写最容易理解的代码,当您重新开始/将其传递给下一个人时。当您遇到性能问题时,进行测量,然后决定如何优化。百分之九十九,它不会在你期望的地方。不要再担心“什么是最快的”,而是专注于代码的正确性和“可理解性”。你关注的是…但这甚至不是我的代码我刚刚在这里写的我想知道它是否真的重要Mo Tuples是一种不友好的数据类型,在属性名称中没有任何含义,因此它将通过创建一个指向Tuple属性的具有良好名称的局部变量来增加代码的清晰度(例如
var numberOfItems=someTuple.Item1;
)。额外局部变量的成本极不可能显著降低您的程序的速度,除非它位于以数百万次的顺序调用的代码的热点部分。当您的程序运行缓慢时,请使用分析来找出成本所在。我敢打赌,这不会通过分配几个局部变量来承担定义为类,而不是结构,因此它需要一个堆分配来创建,并且每次使用它时它都必须跟随指向堆的指针,因此与本地堆栈变量相比,它将慢得多。这是否重要,可能需要使用探查器来确定,因为分配将是小而公平的y快,并且解引用成本通常会被CPU预取隐藏,除非您在CPU利用率通常为100%的计算机上运行此操作。当您询问有关虚构代码的性能问题时,您将得到虚构的答案。如果性能很重要,则使用您自己的结构。也不会影响可读性。性能差?这有什么不好当你认为100.0万个.NET应用服务器正在运行它时,JIT并不是一个非常复杂的优化器。热点JVM要复杂得多。所以,基本上你的性能论证是100000个APP服务器运行它。基于你的JVM评论,我必须声明你正在制作。这是一个遗传逻辑谬误,没有任何具体的例子,就好像你在做错误的指控。你似乎有着相反的观点,有着同样的力量,同样缺乏论据。这也不好。我创建了一个包含大约80个测试的广泛JIT测试套件,并调查了代码gen,以比较新旧JI举一个例子,JIT有多差:当你说
a.x+a.x
时,这会从内存中加载x两次。在这一点上,基本的东西并没有得到优化。(公平地说,新的JIT也有一些好的惊喜。但code gen在所有方面都非常简单。)@ErikPhilips
Tuple<int,int> test = new Tuple<int,int>;

int numberOne = int.Parse(Console.Readline());
int numberTwo = int.Parse(Console.Readline());

test.Item1 = numberOne;
test.Item2 = numberTwo;

for(int i = 0; i < 1000; i ++)
{
    int tempItem1 = test.Item1;
    int tempItem2 = test.Item2;

    if(tempItem1 * i > tempItem2 * i)
    {// do stuff}
    else
    {// do stuff}
}