太多时间打印所有可能包含4个字母的单词

时间:2017-05-24 05:08:06

标签: c++

我写了一个程序,打印所有可能包含4个字母的单词,字母可以是大写或小写,而且花了42分钟,这是很长的时间.`

char Something[5]={0,0,0,0};

for(int i=65;i<=122;i++){ //65 is ascii representation of A and 122 for z
    Something[0]=i;
    cout<<Something<<endl;
    for(int j=65;j<=122;j++){
        Something[1]=j;
        cout<<Something<<endl;
        for(int n=65;n<=122;n++){
            Something[2]=n;
             cout<<Something<<endl;
            for(int m=65;m<=122;m++){
                Something[3]=m;
                 cout<<Something<<endl;`

所以我需要知道程序中大部分时间都需要什么。 我怎样才能使它更有效率。

2 个答案:

答案 0 :(得分:6)

我们可以摆脱对endl的调用,只使用字母,并在完成时简单地写出每个字符串:

#include <string>
#include <vector>
#include <iostream>

int main() {
    std::string out = "    ";

    std::string letters = "abcdefghijklmnopqrstuvwxyz"
                          "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

     for (char f : letters)
         for (char g : letters)
             for (char h : letters)
                 for (char i : letters) {
                     out[0] = f;
                     out[1] = g;
                     out[2] = h;
                     out[3] = i;
                     std::cout << out << '\n';
                 }
}

对我的机器(相当于后端硬件 - AMD A8-7600)的快速测试表明它在半秒钟内运行(输出指向文件)。实际上,时间可能更多地取决于磁盘速度而不是CPU速度。它产生大约30兆字节的输出,因此在最大写入速度为每秒100兆字节(或左右)的典型磁盘上,最小时间大约为三分之一秒,无论CPU速度如何(尽管您可能能够使用非常快的CPU和SSD,可以做得更好。

答案 1 :(得分:2)

重复@Jerry Coffin's answer(这已经是对OP解决方案的一次重大胜利),我的机器得到了额外的20倍改进:

#include <string>
#include <vector>
#include <iostream>

int main() {
    const char l[] = "abcdefghijklmnopqrstuvwxyz"
                     "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // trim away the final NUL
    const char (&letters)[sizeof(l)-1] = (const char (&)[sizeof(l)-1])l;

    std::vector<char> obuf(5*sizeof(letters)*sizeof(letters)*sizeof(letters));

    for (char f : letters) {
        char *out = obuf.data();
        for (char g : letters) {
            for (char h : letters) {
                for (char i : letters) {
                    out[0] = f;
                    out[1] = g;
                    out[2] = h;
                    out[3] = i;
                    out[4] = '\n';
                    out+=5;
                }
            }
        }
        std::cout.write(obuf.data(), obuf.size());
    }
    return 0;
}

在我的机器上重定向到/dev/null编辑:或我的磁盘上的文件; Linux似乎非常擅长IO缓存)Jerry Coffin的答案大约需要400毫秒,我的需要20毫秒。

如果您认为内部循环is just trivial pointer manipulation进入预分配缓冲区,没有函数调用,额外分支和&#34;复杂&#34;这是非常明显的。那些使寄存器中毒并浪费时间的东西(operator<<即使对char来说也是一个非常复杂的野兽 - 如果你问我,没有充分的理由)。 IO(加上愚蠢的iostream开销)每隔约700 KB就完成一次,所以它的成本已经很好地分摊了。