gpt4 book ai didi

c# - 优化 C# 中的 if 语句 (a > 0 && b > 0 && a + b == c)

转载 作者:太空狗 更新时间:2023-10-29 20:00:02 26 4
gpt4 key购买 nike

我目前正在做一些涉及邻接矩阵的图计算,我正在优化它的每一点。

我认为可以优化的指令之一是标题中的原始形式:

if ((adjMatrix[i][k] > 0) && (adjMatrix[k][j] > 0) && (adjMatrix[i][k] + adjMatrix[k][j] == w))

但为方便起见,我将坚持使用标题中提供的表格:

if (a > 0 && b > 0 && a + b == c)

我不喜欢的是 > 0 部分(作为邻接矩阵,在它的初始形式中它只包含 0 和 1,但是随着程序的进行,零被从 2 开始的数字替换,直到没有更多的零。

我做了一个测试并删除了 a 和 b 的 > 0 部分,并且有了显着的改进。在 60088 次迭代中,减少了 792 毫秒,从 3672 毫秒减少到 2880 毫秒,这是原始时间的 78%,这对我来说非常好。

所以我的问题是:您能想出一些方法来优化这样的语句并在 C# 中获得相同的结果吗?可能是一些位运算之类的,我不太熟悉。

回答您想到的每一个想法,即使它不合适。我会亲自进行速度测试,然后让您知道结果。

编辑:这是我要在我的计算机上自己运行的编译器。我刚才描述的不是我要提示的问题/瓶颈。当前形式的程序可以很好地满足我的需求,但我只想插入它前进并使其尽可能基本和优化。希望这能澄清一点。

编辑 我相信提供完整的代码是很有用的,所以就在这里,但请记住我在下面以粗体显示的内容。 我想专注于 if 语句。该程序本质上采用邻接矩阵并存储所有存在的路线组合。然后根据一些系数进行排序和修剪,但是这个我没有包括在内。

int w, i, j, li, k;
int[][] adjMatrix = Data.AdjacencyMatrix;
List<List<List<int[]>>> output = new List<List<List<int[]>>>(c);

for (w = 2; w <= 5; w++)
{
int[] plan;

for (i = 0; i < c; i++)
{
for (j = 0; j < c; j++)
{
if (j == i) continue;
if (adjMatrix[i][j] == 0)
{
for (k = 0; k < c; k++) // 11.7%
{
if (
adjMatrix[i][k] > 0 &&
adjMatrix[k][j] > 0 &&
adjMatrix[i][k] + adjMatrix[k][j] == w) // 26.4%
{
adjMatrix[i][j] = w;

foreach (int[] first in output[i][k])
foreach (int[] second in output[k][j]) // 33.9%
{
plan = new int[w - 1];
li = 0;

foreach (int l in first) plan[li++] = l;
plan[li++] = k;
foreach (int l in second) plan[li++] = l;

output[i][j].Add(plan);
}
}
}

// Here the sorting and trimming occurs, but for the sake of
// discussion, this is only a simple IEnumerable<T>.Take()
if (adjMatrix[i][j] == w)
output[i][j] = output[i][j].Take(10).ToList();
}
}
}
}

在优化构建中添加带有分析器结果的评论

顺便说一句,计时结果正是通过这段代码获得的(没有排序和修剪会显着增加执行时间)。我的测量中没有包含其他部分。在此代码之前有一个 Stopwatch.StartNew(),紧接着有一个 Console.WriteLine(EllapsedMilliseconds)。

如果要对大小做一个概念,邻接矩阵有 406 行/列。所以基本上只有用于执行许多迭代的指令组合,所以我没有太多优化选项。速度目前不是问题,但我想确保在它成为问题时我已准备好。

为了排除“优化其他部分”的问题,这个主题也有讨论的余地,但对于这个具体问题,我只想找到解决方案作为一个抽象的问题/概念。它可以帮助我和其他人了解 C# 编译器如何工作以及如何处理 if 语句和比较,这是我的目标。

最佳答案

对于有符号变量,您可以将 a>0 && b>0 替换为 (a-1)|(b-1) >= 0 ab

同样,条件x == w可以表示为(x - w)|(w - x) >= 0,因为当x != w 表达式的左侧或右侧部分将切换符号位,符号位由按位保留。所有东西放在一起都是 (a-1)|(b-1)|(a+b-w)|(w-a-b) >= 0 表示为单个比较。

或者,轻微的速度优势可能来自推杆递增顺序的概率:

(a|b)>=0(a+b)==w 哪个更有可能?

关于c# - 优化 C# 中的 if 语句 (a > 0 && b > 0 && a + b == c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com