C#方法参数的效率

时间:2016-11-25 11:35:49

标签: c#

我是否正确地说:

public static void MethodName{bool [] boolArray}
{
    bool first = boolArray[0]; 
    bool second = boolArray[1];
    bool third = boolArray[2];
    //Do something
}

比这更有效:

MethodName(new[] { true, true, true });

我的想法是,他们必须要声明第一,第二和第三 - 只是在不同的地方。但是对于第二个,它必须将它添加到一个数组中,然后再将其解压缩。

除非你像这样声明数组:

variants

在哪种情况下,我不确定哪个更快?

我问,因为我正在考虑使用第二个,但想知道是否/对性能有什么影响。

在这种情况下,表现并不是特别重要,但对我来说澄清这一点会很有帮助。

另外,第二个的优点是你可以传递任意数量的值,我觉得它也更容易阅读?

我想使用它的原因是因为已经有大约30个参数被传递到该方法中,我觉得继续添加更多内容变得令人困惑。所有这些bool密切相关,所以我认为它可以使代码更易于打包它们。

我正在处理现有代码,并且在我的项目范围内花费时间重新设计方法以减少传递给方法的参数数量,但我认为理解这个方法的含义是一个好习惯。变化

7 个答案:

答案 0 :(得分:10)

在表现方面,只有答案for your question

  

"程序员浪费了大量时间思考,或者   担心,他们的节目非关键部分的速度,以及   这些效率尝试实际上会产生很大的负面影响   在考虑调试和维护时。我们应该忘记   效率很低,大约97%的时间说:过早优化   是万恶之源。但我们不应该放弃我们的机会   在那个关键的3%。"

就生产力而言,parameters > arrays

旁注

每个人都应该知道Donald Knuth在1974年所说过的话。在这个声明发表40多年后,我们仍然依赖过早优化(甚至无意义的优化)经常!

进一步阅读

我会看看其他Q&A on Software Engineering

答案 1 :(得分:4)

  

我是否正确地说:   比这更有效:

孤立地,是的。除非调用者已经拥有该数组,否则第二个是相同或甚至(对于更大的参数类型或更多参数),要快一点。

  

我问,因为我正在考虑使用第二个,但想知道是否/对性能有什么影响。

你为什么要考虑第二个?如果它在通话时更自然,那么使其更自然的原因可能也会产生性能影响,使得第二个在更广泛的背景下变得更好,超过这个。

如果您从三个单独的bool开始,并且只是为了打开它们而再次打开它们,那么除了更多打字之外,我不会在实践中看到它提供的内容。

所以你考虑这个的原因在这里更重要。

  

在这种情况下,表现并不是特别重要

然后真的不用担心。它肯定以热门路径代码而闻名,它会使params提供过载,这些过载会占用一定数量的单个参数,但它确实只会对热路径产生影响。如果你不是在一条炙手可热的道路上,那么一生节省两个选择中的任何一个的计算时间确实更有效,这不太可能增加到 你在这里写帖子的时间。

如果你 在一条热门道路上并且真的需要每隔纳秒削减一次,那么因为你需要进行如此多的循环以至于它会增加真实的东西,那么你来衡量。在性能方面,孤立的变化具有非孤立的效果,因此,如果更宽的上下文意味着调用A的代码比B慢,那么互联网上的人是否告诉你A比B更快并不重要。第一个测量值是"我是否可以注意到?",如果该测量的答案为" no"然后单独留下并找到性能影响明显优化的地方。

写"自然"代码开始之前,看看小调整是否会对实际上伤害你的位产生性能影响。这不仅仅是因为可读性等的重要性,还因为:

  1. 越多"自然"使用给定语言的代码通常效率更高。即使你认为它不可能,它也有可能从幕后的编译器优化中受益。
  2. 越多"自然"代码在需要的时候比执行一些奇怪的事情的代码更容易调整性能。

答案 2 :(得分:1)

第三种方式是使用paramsParams - MSDN

最后我不认为它会在性能上有太大变化。

array []虽然继承自实现ArrayIEnumerableIEnumerable<t>ICloneableIList的抽象ICollection类,     IEnumerableIStructuralComparableIStructuralEquatable),这意味着对象比三个值类型参数更加爆炸,这会使得明显变慢 Array - MSDN

答案 3 :(得分:1)

我认为这根本不会影响您应用的效果。

个人

我选择第一个选项有两个原因:

  1. 命名每个参数:如果项目是一个大型项目,并且有大量编码或可能的未来编辑和增强。
  2. 可用性:如果您要发送类似参数的列表,那么您必须使用数组或列表,如果它只是几个相同类型的参数,那么您应该单独发送它们。

答案 4 :(得分:0)

你可以测试两者的性能差异,但我怀疑会有很大差异。

你必须考虑可维护性,是另一个程序员,甚至你自己会理解为什么你会在几周内或那几个月的时间进行审查时这样做?是否可以轻松扩展,您可以将不同的对象类型传递给您的方法吗?

如果你传递一个项目集合,那么肯定将它们打包成一个数组会比为每个附加项目指定一个新参数更快吗?

如果必须,你可以这样做,但你考虑过param数组吗?

Why use the params keyword?

public static void MethodName{params bool [] boolAarray}
{
    //extract data here
}

答案 5 :(得分:0)

同意Matias&#39;答案。

我还想补充一点,你需要添加错误检查,因为你传递了一个数组,并且没有说明你将收到的数组中有多少元素。因此,您必须首先检查阵列中是否有三个元素。这将平衡您可能获得的小穿孔增益。

此外,如果您想让其他开发人员可以使用此方法(作为API的一部分,公共或私有),智能感知将无法帮助他们完全支持他们设置的参数......

使用三个参数时,您可以这样做:

///<summary>
///This method does something
///</summary>
///<param name="first">The first parameter</param>
///<param name="second">The second parameter</param>
///<param name="third">The third parameter</param>
public static void MethodName{bool first, bool second, bool third}
{
   //Do something
}

它将很好地展示给其他人......

答案 6 :(得分:0)

我会采用不同的方法并使用Flags;

public static void MethodName(int Flag) 
{ 
    if (Flag & FIRST) { } 
} 

编译器可能会进行自己的优化;

检查http://rextester.com/QRFL3116 Jamiec评论中添加的方法

  • M1花了5毫秒
  • M2花了23毫秒
  • M3花了4毫秒