C++循环不断计算 if 语句,使其太慢



我目前有一个C++程序,它应该生成每个可能的域名,最多到一定数量的数字。我拥有的代码当前非常冗长(这很好),但一旦它开始生成超过 4 位数字,速度也会非常慢。这里显示了真正开始出错的循环:

const char* chars[] = {"a","b","c","d","e","f","g","h","i","j","k",
"l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "0", "1",
"2", "3", "4", "5", "6", "7", "8", "9", "-"};
int char_num = 1;
[...]
if(char_num == 5) {
for(int i = 0; i < 36; i++) {
for(int j = 0; j < 37; j++) {
for(int k = 0; k < 37; k++) {
for(int l = 0; l < 37; l++) {
for(int m = 0; m < 36; m++) {
cout << "adding " << chars[i] << chars[j] << chars[k] << chars[l] << chars[m] << ".com to listn";
if(i == 35 && j == 36 && k == 36 && l == 36 && m == 35) {
char_num++;
cout << "Generating to " << char_num + 1  << " charactersn";
}
}
}
}
}
}
}

我打算在这句话之后至少增加三到四个 if 语句,每个语句中都有越来越多的 for 循环。我还需要将输出写入文件,并使用此文件进行DNS查找,因此我需要我能获得的每一滴性能,这样我就不会等待数周才能完成程序。

我目前主要关心的是程序正在评估每个交互的 if 语句,我认为考虑到嵌套循环的数量,这对性能有显着影响。为了阻止这种情况,我尝试将 if 语句移动到一个单独的函数中,并在完成后让它返回一个值,但我注意到当我这样做时,我无法从函数内登录到控制台,这使事情变得更加复杂。

在C++中执行此操作的正确过程是什么,还有其他方法可以加快代码速度吗?我之前确实尝试过在 node 中编写代码.js但是当我开始写入文件时,它变得疯狂并抛出一堆内存不足错误,我认为无论如何C++可能会更快,因此我切换了语言。

您的if语句似乎正在检查循环的结束。有一个简单的解决方案可以避免这种情况:删除if并将代码放在循环之后

但是,如果您需要添加更多依赖于循环变量的if,我真的不知道如何优化它。但是,不要将它们放在函数中:调用函数的开销会减慢您的代码(并且优化编译器无论如何都会内联您的函数)。

以下是您可以探索的几种可能性:

  • 使用多线程/多处理。如果做得好,这可以将执行时间除以计算机上的 CPU 内核数
  • 启用编译器优化(-O3-Ofastg++)

最后一件事:如果消费者程序接受来自标准输入的数据,那么将程序的输出管道到其中的速度将是生成名称然后使用它们的两倍。EG 代替

producer > storage.txt
consumer < storage.txt

producer | consumer

专注于代码优化。在语句中,每次迭代都会不断重新访问 char 数组的同一成员,浪费时钟周期。

`cout << "adding " << chars[i] << chars[j] << chars[k] << chars[l] << chars[m] << ".com to listn";`

优化这一点的一种方法是添加临时变量。

char tempI;
char tempJ;
char tempK;
char tempL;
if(char_num == 5) {
for(int i = 0; i < 36; i++) {
tempI = char[i];
for(int j = 0; j < 37; j++) {
tempJ = char[j];
for(int k = 0; k < 37; k++) {
tempK = char[k];
for(int l = 0; l < 37; l++) {
tempL = char[l];
for(int m = 0; m < 36; m++) {
cout << "adding " << tempI << tempJ << tempK << tempL << 
chars[m] << ".com to listn";
if(i == 35 && j == 36 && k == 36 && l == 36 && m == 35) {
char_num++;
cout << "Generating to " << char_num + 1  << " charactersn";
}
}
}
}
}
}
}

你可以做一些事情,通过你编写代码的方式,使代码在时间和空间局部性方面更快。

还可以将编译器优化 -03 与 g++ 等一起使用。

或者考虑重写你的算法,因为在时间复杂度方面可能有更好的方法

最新更新