字符数组和printf使程序运行缓慢
character array and printf makes program slow
(嗯,我的英语不好(:(
我的朋友现在正在学习C++,他发现了一个我无法解释的问题。
第一个代码,它运行超过2000MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int main()
{
scanf("%sn",a);
int l=1,r=strlen(a);
for (int i=0;i<strlen(a);i++)
if (a[i]=='l')
ans[r--] = i+1;
else
ans[l++] = i+1;
for (int i=1;i<=strlen(a);i++)
printf("%dn",ans[i]);
return 0;
}
第二个代码,它运行465MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int size;
int main()
{
scanf("%s",a);
int l=1,r=strlen(a);
size = r;
for (int i=0;i<strlen(a);i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=size;i++)
printf("%dn",ans[i]);
return 0;
}
第三个代码,它运行超过2000MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int size;
int main()
{
scanf("%s",a);
int l=1,r=strlen(a);
size = r;
for (int i=0;i<size;i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=strlen(a);i++)
printf("%dn",ans[i]);
return 0;
}
最后一个代码,它运行515MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int ans[2000000];
string a;
int main()
{
cin >>a;
int l=1,r=a.size();
for (int i=0;i<a.size();i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=a.size();i++)
printf("%dn",ans[i]);
return 0;
}
当输入字符串大小为10^5 时
所以,原因是循环的第二个。
我的问题是,为什么"strlen"函数和print in for循环会使代码如此缓慢?
通过在循环条件中写入strlen
—包含200万次迭代的循环—您正在扫描一个2兆字节的字符串200万次。当然这需要一些时间!
当您只预先计算一次字符串长度时,这种延迟就会消失。
此外,你可能会发现,在任何情况下,将2MB的文本流式传输到控制台都会明显"慢"。
strlen
函数在循环中时,每次都必须在循环中执行。这是一个额外的函数调用,它必须遍历整个字符串才能找到它的长度。
在size
中缓存长度,意味着每次通过循环都不需要重做这些。
因此,没有错误。这是预期的行为。
相关文章:
- 如何通过cpp程序运行shell脚本
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 无法在 VS Code 上使用代码运行程序运行C++文件
- 程序运行,但文件无法打开.C++中的命令行
- 终端命令在程序运行后自动打开图形
- 程序运行,但并非所有内容都显示出来
- 为什么程序运行时我的第二个循环不执行?
- 如何在 c++ 程序运行时隐藏控制台?
- 通过C++应用程序运行 shell 脚本始于 JAVA
- C++字数统计程序使用C字符串错误在程序运行后
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- 如何通过C++程序运行Windows命令?
- 在程序运行时更改 DLL
- 程序运行时,未读取文件
- C 是否有办法使程序运行,只要引入了新值
- CreateProcess:某些应用程序运行其他应用程序
- 使用一个 C 程序运行 python 脚本(不同的 python 版本)
- 从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常