C# 我可以避免这种代码的复制和粘贴吗?

C# 我可以避免这种代码的复制和粘贴吗?,c#,optimization,C#,Optimization,我有两个函数,它们的内容非常相似 // mock-up code bool A() { while(1000000) { // 3 lines of A() specific code // 15 lines of shared code, pasted in // 1 lines of A() specific code } } bool B() { while(1000000) { // 2 lines

我有两个函数,它们的内容非常相似

// mock-up code

bool A() {
    while(1000000) {
        // 3 lines of A() specific code
        // 15 lines of shared code, pasted in
        // 1 lines of A() specific code
    }
}
bool B() {
    while(1000000) {
        // 2 lines of B() specific code
        // 15 lines of shared code, pasted in
        // 2 lines of B() specific code
    }
}     
我不希望将15行共享代码粘贴到这两个函数中,因为这两行代码都非常复杂,如果我以后更改代码,我不想记住在这两个地方都更改代码

如果我把15行放进一个单独的函数中,我会受到很大的性能影响,因为JIT拒绝内联它;可能是由于参数列表中的结构和/或“复杂”的流控制元素


还有别的办法吗,还是我运气不好?

你所说的“重大”业绩打击远没有你想象的那么重要

如果它非常重要,您可以尝试告诉JIT编译器使用内联方法来内联它,尽管如果该方法不是虚拟的,他应该这样做

MSDN中的示例:

using System;
using System.Globalization;
using System.Runtime.CompilerServices;

public class Utility
{
   [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] 
   public static string GetCalendarName(Calendar cal)
   {
      return cal.ToString().Replace("System.Globalization.", "").
                 Replace("Calendar", "");
   }
}

你所说的“重大”业绩打击远没有你想象的那么重要

如果它非常重要,您可以尝试告诉JIT编译器使用内联方法来内联它,尽管如果该方法不是虚拟的,他应该这样做

MSDN中的示例:

using System;
using System.Globalization;
using System.Runtime.CompilerServices;

public class Utility
{
   [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] 
   public static string GetCalendarName(Calendar cal)
   {
      return cal.ToString().Replace("System.Globalization.", "").
                 Replace("Calendar", "");
   }
}

让我们不要找太复杂的事情,那怎么办?虽然不太干净,但这可能是您必须为不复制和性能付出的代价:

布尔型AorB布尔型标志{ 而100万{ 如果弗拉加{ //3行特定代码 } 否则{ //1行B特定代码 } //15行共享代码,粘贴在 如果弗拉加{ //2行特定代码 } 否则{ //2行B特定代码 } } }
让我们不要找太复杂的事情,那怎么办?虽然不太干净,但这可能是您必须为不复制和性能付出的代价:

布尔型AorB布尔型标志{ 而100万{ 如果弗拉加{ //3行特定代码 } 否则{ //1行B特定代码 } //15行共享代码,粘贴在 如果弗拉加{ //2行特定代码 } 否则{ //2行B特定代码 } } }
也许是问汉斯·帕桑一个问题?单独函数的返回类型是什么?分成小方法并增加reusability@JeremyChild或者Jon Skeet可能尝试另一个C实现,即,或者等到您的C实现,即编译器和运行时得到改进。或者使用一些文本预处理器。@Barmar C只定义了或没有定义宏,它们不会扩展到任何东西,也许对Hans Passant来说是个问题?单独函数的返回类型是什么?分成小方法并增加reusability@JeremyChild或者Jon Skeet可能尝试另一个C实现,即,或者等到您的C实现,即编译器和运行时得到改进。或者使用一些文本预处理器。@Barmar C只定义或未定义宏,它们不会扩展到任何内容最后的答案似乎已被删除,所以我将在这里再次发布。A是一个*探路者,B是一个稍微修改过的版本,类似于Dijkstra的算法。目前,这些算法的C++实现是一个设计目标。但是,在非内联函数调用的情况下,性能不具有竞争力。您不能强迫一个方法在C++中以C的形式内嵌,而攻击性内联可能会内嵌它,可能不,或者更坏的可能在不同的硬件上有所不同。遗憾的是,这甚至不是我的选择,代码的一个要求是.NET Framework 2.0兼容性。最后一个答案似乎已被删除,所以我将在这里再次发布。A是一个*探路者,B是一个稍微修改过的版本,类似于Dijkstra的算法。目前,这些算法的C++实现是一个设计目标。但是,在非内联函数调用的情况下,性能不具有竞争力。您不能强迫一个方法在C++中以C的形式内嵌,而攻击性内联可能会内嵌它,可能不,或者更坏的可能在不同的硬件上有所不同。遗憾的是,这甚至不是我的选择,代码的一个要求是.NETFramework2.0的兼容性。我尝试了一下使用goto语句的设计。我的理由是,有了goto,可能就不需要评估AorB在while循环的每次迭代中是作为A还是B运行了。我没有成功,为什么要去?这会让你的代码读起来更糟糕。从我发布的内容开始,看看进展如何。如果你喜欢它,你可以想出你想写它的方式。不要试图优化到节省if-by-while迭代的程度,这是没有意义的:.NETVM可能会自己解决问题,也许你认为不会发生的事情。我尝试了使用goto语句的设计。我的理由是,有了goto,就有可能避免需要像goto一样 ses判断AorB在while循环的每次迭代中是作为A还是B运行。我没有成功,为什么要去?这会让你的代码读起来更糟糕。从我发布的内容开始,看看进展如何。如果你喜欢它,你可以想出你想写它的方式。不要试图优化到节省if-by-while迭代的程度,这是没有意义的:.NETVM可能会自己解决问题,也许你认为不会发生的事情。