我能避免这种代码的复制粘贴吗?
本文关键字:复制 能避免 代码 | 更新日期: 2023-09-27 18:06:35
我有两个函数,它们的内容非常相似。
// 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编译器使用MethodImplOptions枚举来内联它,尽管如果方法不是虚拟的,他应该这样做。查看更多信息。
示例(来自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", "");
}
}
我们不要找太复杂的东西,这个怎么样?不那么干净,但这可能是你必须付出的代价,既不复制又有性能:
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
}
}
}