gpt4 book ai didi

c++ - 我能用这个瓶颈做什么

转载 作者:太空狗 更新时间:2023-10-29 20:23:51 25 4
gpt4 key购买 nike

我刚刚找到了一种方法,可以将我的代码算法从 50 分钟优化到 15 分钟,但这部分需要 14 分钟。它将成为更大模型化系统的一部分,所以我不能让它运行太久。由于我必须比较具有大约 100,000 个值(100 亿个比较)的 vector 的所有值,我想知道是否有优化代码的方法。

struct Coor 
{
double x1; double y1; //Coordinate of Node 1
double x2; double y2; //Coordinate of Node 2
std::vector<int> C1; //Index of the edges connected to Node 1
std::vector<int> C2; //Index of the edges connected to Node 2
};

std::vector<Coor> Connection_S(std::vector<Coor> Nodes)
{
N = Nodes.size();

for (i = 0; i < N; ++i)
{
for (j = 0; j < N; ++j)
{
if (i == j)
{
continue;
}
if ( ( Nodes[i].x1 == Nodes[j].x1 && Nodes[i].y1 == Nodes[j].y1 ) ||
( Nodes[i].x1 == Nodes[j].x2 && Nodes[i].y1 == Nodes[j].y2 ) )
{
Nodes[i].C1.push_back(j);
}
if ( ( Nodes[i].x2 == Nodes[j].x1 && Nodes[i].y2 == Nodes[j].y1 ) ||
( Nodes[i].x2 == Nodes[j].x2 && Nodes[i].y2 == Nodes[j].y2 ) )
{
Nodes[i].C2.push_back(j);
}
}
}
return Nodes;
}

我对 C++ 还是比较陌生,所以我不习惯该语言可以提供的所有可能性以及使一个函数比另一个函数更快的区别。

最佳答案

编译器优化设置

首先打印出汇编语言列表。
接下来,将优化级别设置为“高速”;重新编译。
将优化的装配与未优化的装配进行比较。

预加载变量

您可以通过预加载您正在比较的值来节省一些费用。 (注意:编译器可能已经这样做了;请检查您本地的汇编语言是否属实。)
示例:

const double ni_x1(Nodes[i].x1);
const double ni_x2(Nodes[i].x2);
const double nj_y1(Nodes[i].y1);
const double nj_y2(Nodes[i].y2);

if (((ni_x1 == nj_x1) && (ni_y1 == nj_y1))
// ...

此处的优化技术是允许处理器将数据预取到其数据缓存中。

减少分支指令

分支指令比数据指令需要更多的时间让处理器执行。所以,如果可能的话,消灭它们。
(有些处理器有足够的缓存来将循环加载到指令缓存中而无需重新加载。无论如何,处理器仍然有一些额外的逻辑要执行,这比处理数据指令花费更多的时间。)

您可以使用一些 bool 代数。再次检查汇编语言,看看是否提高了速度。示例:

bool is_equal = false;
is_equal = (ni_x1 == nj_x1);
is_equal = is_equal && (ni_y1 == nj_y1);

如果您的处理器有条件汇编指令,则以上内容可能允许编译器生成条件汇编指令。希望编译器可以生成连续的数据指令。

不动点运算

另一种选择是使用定点算法。这将允许积分算术运算,这通常比浮点运算更快。

例如,给定以升为单位的体积,则可能有 3.141 升。如果该值表示为毫升,则该值将是整数:3141。

优点:更好的准确性和平等性。例如,对于 32 位处理器,您可以有 32 位的“尾数”,而 float 可能只有 24 位的“尾数”,因为有些位是为符号和指数保留的。

关于c++ - 我能用这个瓶颈做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076948/

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