c – 我可以用这个瓶颈做些什么
作者:互联网
我刚刚找到了一种方法来优化我的代码算法从50到15分钟,但这部分需要14分钟.它将成为更大的模型化系统的一部分,所以我不能让它长期运行.因为我必须比较我的矢量的所有值,它具有大约100,000个值(100亿比较),我想知道是否有一种方法来优化代码.
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的新手,所以我不习惯语言可以提供的所有可能性以及使功能比另一种更快的区别.
解决方法:
编译器优化设置
首先打印出汇编语言列表.
接下来,将优化级别设置为High for Speed;重新编译.
将优化组件与非优化组件进行比较.
预加载变量
您可以通过预加载您正在比较的值来节省一些成本. (注意:编译器可能已经这样做了;请检查您的本地汇编语言是否真实.)
例:
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 is_equal = false;
is_equal = (ni_x1 == nj_x1);
is_equal = is_equal && (ni_y1 == nj_y1);
如果你的处理器有这个,上面可能允许编译器生成条件汇编指令.希望编译器可以生成连续的数据指令.
定点算术
另一种选择是使用定点算术.这将允许整数算术运算,这通常比浮点运算更快.
例如,给定的升数量,有可能有3.141升.如果该值表示为毫升,则该值将为积分:3141.
优点:更好的准确性和平等性.例如,对于32位处理器,您可以有32位“尾数”,而浮点可能只有24位“尾数”,因为有些位是为符号和指数保留的.
标签:c,algorithm,for-loop,optimization,graph-algorithm 来源: https://codeday.me/bug/20190824/1709554.html