繁体   English   中英

首先进行循环需要很多时间

[英]First for loop take much time

这是我第二次将此问题作为第一次被标记为重复的问题,但是这次我未作任何答复,因此我对其进行了某些修改。

如今,我正在致力于代码的优化,我看到很多代码,我们在其中创建一个新变量,然后进行初始化,如下面的示例代码中的第一个循环所示: 代码示例

BigInteger limit = new BigInteger("10000");
long l = System.currentTimeMillis();
for (BigInteger i = BigInteger.ONE; i.compareTo(limit) < 0; i = 
i.add(BigInteger.ONE))
{
    BigDecimal temp = new BigDecimal(0);
}
long l1 = System.currentTimeMillis();

//After modification
BigDecimal temp1;
for (BigInteger i = BigInteger.ONE; i.compareTo(limit) < 0; i = 
i.add(BigInteger.ONE))
{
    temp1 = new BigDecimal(0);
}
long l2 = System.currentTimeMillis();
System.out.println("1st loop time: "+(l1-l)/1000.0);
System.out.println("2nd loop time: "+(l2-l1)/1000.0);

然后第二步,我做了一些修改,如图所示。 我的问题看起来都很熟悉,只是可变范围不同,但是第一个循环需要很多时间。

好的,正如某些人说的那样,使用修改后的代码,但是随后我做了另一个实验: 代码示例

BigInteger limit = new BigInteger("10000");
long l = System.currentTimeMillis();
BigDecimal temp1;
for (BigInteger i = BigInteger.ONE; i.compareTo(limit) < 0; i = i.add(BigInteger.ONE))
{
    temp1 = new BigDecimal(0);
}
long l1 = System.currentTimeMillis();
for (BigInteger i = BigInteger.ONE; i.compareTo(limit) < 0; i = i.add(BigInteger.ONE))
{
    BigDecimal temp = new BigDecimal(0);
}
long l2 = System.currentTimeMillis();
System.out.println("1st loop time: "+(l1-l)/1000.0);
System.out.println("2nd loop time: "+(l2-l1)/1000.0);

与第二个循环相比,在第一个循环中要花费很多时间,但是人们说第一个循环更好,或者有些人说第二个循环更好,但我认为不是。 提供一些示例,以便我可以理解哪个是最好的,以及为什么会这样。

如果您正在考虑代码的时间复杂性
然后这两个循环具有相似的复杂性,并且对于内存复杂性,在循环中声明引用变量可能会使用更多的堆栈内存,而且可能会发生编译器在代码中添加一些优化的情况,这可能是您看到时间差异的原因,还可以添加volatile方法中的修饰符以检查实际性能。volatile将强制编译器不对该方法进行任何优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM