- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在做一些涉及邻接矩阵的图计算,我正在优化它的每一点。
我认为可以优化的指令之一是标题中的原始形式:
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
a 和 b。
同样,条件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/
我有两种结构,Header 和Session,它们都符合协议(protocol)TimelineItem。 我有一个 Array 由 TimelineItem 组成,如下所示: [Header1, S
这个问题在这里已经有了答案: Multiple assignment and evaluation order in Python (11 个答案) 关闭 6 年前。 我刚接触python所以想问你
我试图找到一种方法来在 R 中获取 A、A、A、A、B、B、B、B、B 的所有可能的唯一排列的列表。 组合最初被认为是获得解决方案的方法,因此组合的答案。 最佳答案 我认为这就是你所追求的。 @bil
我怎样才能将两个给定的向量混合成一个新的向量,它以交替的顺序保存它们的值。 (f [a a] [b b]) ; > [a b a b] 这是我想到的: (flatten (map vector [:a
这是我的第一个问题,我开始学习Python。之间有区别吗: a, b = b, a + b 和 a = b b = a + b 当您在下面的示例中编写它时,它会显示不同的结果。 def fib(n):
这个问题在这里已经有了答案: Why is there an injected class name? (1 个回答) 12 个月前关闭。 我不知道如何解释: namespace A { struct
我尝试了一些代码来交换 Java 中的两个整数,而不使用第三个变量,使用 XOR。 这是我尝试过的两个交换函数: package lang.numeric; public class SwapVars
假设类 B 扩展类 A,并且我想为 B 声明一个变量。什么更有效?为什么? B b或 A b . 最佳答案 您混淆了两个不同的概念。 class B extends A { } 意味着B 是 A .
我不确定这个问题的标题是什么,这也可能是一个重复的问题。所以请相应地指导。 我是 python 编程的新手。我有这个简单的代码来生成斐波那契数列。 1: def fibo(n): 2: a =
我在谷歌上搜索了有关 dynamic_cast 的内容,我发现显式地将基类对象转换为派生类指针可能是不安全的。但是当我运行一些示例代码来检查它时,我没有收到任何错误。请在下面找到我的代码: class
这个问题在这里已经有了答案: What is this weird colon-member (" : ") syntax in the constructor? (14 个答案) 关闭 8 年前。
在不重现产生非整数值的表达式的情况下实现以下目标的惯用方法是什么(在我的真实情况下,该值是在我不想重现的冗长查询之后计算为百分比的): SELECT * FROM SomeTable WHERE 1/
在析构中,这两个代码的结果确实不同。我不确定为什么。 提示说 const [b,a] = [a,b] 将导致 a,b 的值为 undefined (从左到右的简单分配规则)。我不明白为什么会这样。 l
C++ Templates - The Complete Guide, 2nd Edition介绍max模板: template T max (T a, T b) { // if b < a th
我最近开始学习代码(Java),并根据第 15.17.3 节在 Oracle 网站上查找了模运算符。以下链接: http://docs.oracle.com/javase/specs/jls/se8/
无法理解以下行为。 d1 := &data{1}; 的区别d1 和 d2 := 数据{1}; &d1。两者都是指针,对吧?但他们的行为不同。这里发生了什么 package main import "f
这个问题在这里已经有了答案: How to make loop infinite with "x = y && x != y"? (4 个回答) How can i define variables
在我的程序中,当我调试我的代码时,它似乎在我生成的代码中的某处 X1=['[a,a,a]','[b,b,b]'] 还有我生成的其他地方 X2=[[a,a,a],[b,b,b]] 当我想添加这两个列表然
我试图使用递归将两个整数相乘,并意外编写了这段代码: //the original version int multiply(int a, int b) { if ( !b ) retu
我有一个列表中数字之间所有可能的操作组合: list = ['2','7','8'] 7+8*2 8+7*2 2*8+7 2+8*7 2-8*7 8-2/7 etc 我想知道是否可以说像 ('7*2+
我是一名优秀的程序员,十分优秀!