Первый цикл займет много времени - PullRequest
0 голосов
/ 27 февраля 2019

Второй раз я задаю этот вопрос, так как в первый раз он помечается как дубликат, но на этот раз я не получил ответа, я внес в него определенные изменения.

В настоящее время я работаю надоптимизации кода, и я вижу много кода, в котором мы создаем новую переменную и затем инициализируем, как показано в первом цикле в приведенном ниже примере кода: Пример кода

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);

В этом первом цикле требуется больше времени по сравнению со вторым. Но люди говорили, что первый лучше, а некоторые говорили, что второй лучше, но я так не думаю.Приведите пример, чтобы я мог понять, какой из них лучше и почему так происходит.

1 Ответ

0 голосов
/ 27 февраля 2019

Если вы рассматриваете временную сложность кода
Тогда оба цикла имеют одинаковую сложность, и для сложности памяти объявление ссылочной переменной в цикле может использовать больше памяти стека, также может случиться так, что компилятор добавляет некоторую оптимизацию в код, которыйможет быть причиной того, что вы видите разницу во времени, вы также можете добавить модификатор volatile в свой метод для проверки фактической производительности .volatile заставит компилятор не выполнять оптимизацию метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...