我有两个功能,它们的内容非常相似。
// 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拒绝内联它;可能是由于参数列表中的结构和/或'复杂'流控制元素)。
还有其他方式,还是我运气不好?
答案 0 :(得分:0)
你所谈论的这种“重大”表现并不如你想象的那么重要。
如果它如此重要,您可以尝试告诉JIT编译器使用MethodImplOptions Enumeration内联它,虽然如果方法不是虚拟的,他应该这样做。 For more information
示例(来自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", "");
}
}
答案 1 :(得分:-1)
我们不要寻找过于复杂的事情,那又怎么样?不是那么干净,但这可能是你必须付出的代价才能兼顾非复制和表现:
boolean AorB (boolean flagA) {
while(1000000) {
if (flagA) {
// 3 lines of A() specific code
}
else {
// 1 line of B() specific code
}
// 15 lines of shared code, pasted in
if (flagA) {
// 2 lines of A() specific code
}
else {
// 2 lines of B() specific code
}
}
}