我写了一个程序,打印所有可能包含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;`
所以我需要知道程序中大部分时间都需要什么。 我怎样才能使它更有效率。
答案 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就完成一次,所以它的成本已经很好地分摊了。