java - 为什么如果我使用循环作为输入,算法会更慢
问题描述
我想使用 System.currentTimeMillis() 计算 analizeString() 的执行时间。
public static void main(String[] args) {
String myString ="";
for(int character = 0; character < 50000; character+=10000){
for(int i = 0; i < character; i++){
myString =+ randomCharacter();
}
long time1 = System.currentTimeMillis();
analizeString(myString);
long time2 = System.currentTimeMillis();
printTimeInFile(time2 - time1);
}}
在这种情况下,当输入为 40000 时,我发现的时间约为 4 秒。但如果我不使用这样的循环:
public static void main(String[] args) {
String myString ="";
long input = 40000;
//for(int character = 0; character < 50000; character+=10000){
for(int i = 0; i < input; i++){
myString =+ randomCharacter();
}
long time1 = System.currentTimeMillis();
analizeString(myString);
long time2 = System.currentTimeMillis();
printTimeInFile(time2 - time1);
}
时间约为 0.3 秒。
随着循环,程序非常慢。为什么会有这种差异?我的假设是上一次也被添加了。有什么帮助吗?谢谢!
解决方案
在第一个示例中,您有 10000 + 20000 + 30000 + 40000 = 100000 次迭代,并且您的方法针对 100000 个字符的字符串运行最后一次迭代。
- 第一次迭代你有 10 000 个字符的时间
- 第二次迭代你有 30 000 (10 000 + 20 000) 个字符的时间
- 第三次迭代你有 60 000 (30 000 + 30 000) 个字符的时间
- 第四次(最后一次)迭代你有 100 000(60 000 + 40 000)个字符的时间
在第二个示例中,您有一个 40000 个字符的字符串。这就是为什么时间不同的原因。
检查您的 analizeString() 方法,将字符串增加 2.5 倍,您的时间增加超过 13 倍(4 秒 / 0,3 秒)
推荐阅读
- excel - 如何找到不等于已列出的值的下一个最高 MAX
- c# - 如何使主菜单中的 ui 元素适合每个选定的分辨率?
- java - 在 meta-inf 中生成的清单文件缺少类路径引用
- html - 为什么我的 div 与下面的其他 div 重叠?
- python - Groupby 占总数的百分比
- android - 如何从Android中的json数组中读取第二个数组
- outlook - Outlook 模块扩展 - 维护上下文
- python - 如何在 Pandas 中为未命名对象设置过滤器/标准
- c++ - 从函数指针 C++ 向函数发送参数
- android - Android 开发者控制台 - 卸载应用