Здравствуйте, Ildar Karimov, Вы писали:
IK>и, главное, почему тот или иной вариант быстрее?
Практически: в Java на таких вшей спидометры не прицепишь.
Теоретически: каждая запись генерирует одинаковое количество инструкций.
Вы стебаетесь или шутки из C++ вспоминаете?
Re[2]: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, rsn81, Вы писали:
R>Здравствуйте, Ildar Karimov, Вы писали:
IK>>и, главное, почему тот или иной вариант быстрее? R>Практически: в Java на таких вшей спидометры не прицепишь. R>Теоретически: каждая запись генерирует одинаковое количество инструкций.
Я проверил на простом примере:
public class Test
{
Integer m1(Integer i)
{
Integer j = 0;
j=++i;
return j;
}
Integer m2(Integer i)
{
Integer j = 0;
j=i++;
return j;
}
}
D:\>javac -J-showversion Test.java
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)
D:\>javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>")V
4: return
Здравствуйте, rsn81, Вы писали:
R>Здравствуйте, Ildar Karimov, Вы писали:
IK>>и, главное, почему тот или иной вариант быстрее? R>Практически: в Java на таких вшей спидометры не прицепишь. R>Теоретически: каждая запись генерирует одинаковое количество инструкций. R>Вы стебаетесь или шутки из C++ вспоминаете?
да нет, я вообще серьёзно.
ладно, вот что говорит декомпайлер:
1) j = i = Integer.valueOf(i.intValue() + 1);
2) Integer localInteger1 = i; Integer localInteger2 = i = Integer.valueOf(i.intValue() + 1); j = localInteger1;
угадайте, какой вариант i++, а какой — ++i?
Re[3]: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, Ildar Karimov, Вы писали:
IK>да нет, я вообще серьёзно.
Ага, не заметил, что речь про объекты, а не примитивы.
IK>ладно, вот что говорит декомпайлер: IK>1) j = i = Integer.valueOf(i.intValue() + 1); IK>2) Integer localInteger1 = i; Integer localInteger2 = i = Integer.valueOf(i.intValue() + 1); j = localInteger1;
Ага, как и выше процитировали, аж на 2 инструкции чтения/записи больше. Тем не менее, сомнения что это отразиться на исполнении кода в стиле "быстрее-медленее".
IK>угадайте, какой вариант i++, а какой — ++i?
Соответственно, ваши 2) и 1).
Re[4]: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, rsn81, Вы писали:
R>Ага, не заметил, что речь про объекты, а не примитивы.
ага
R>Ага, как и выше процитировали, аж на 2 инструкции чтения/записи больше. Тем не менее, сомнения что это отразиться на исполнении кода в стиле "быстрее-медленее".
однако на моей машине это даёт ~+8%
Re: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, Ildar Karimov, Вы писали:
IK>ладно, вот что говорит декомпайлер: IK>1) j = i = Integer.valueOf(i.intValue() + 1); IK>2) Integer localInteger1 = i; Integer localInteger2 = i = Integer.valueOf(i.intValue() + 1); j = localInteger1;
IK>угадайте, какой вариант i++, а какой — ++i?
Вопрос поставлен неправильно.
Если сравнивать операции
i++; и ++i;
то они равноценны, т.к. имеют на выходе один результат — инкрементированное на единицу значение i.
Если же рассматривать именно эти операции
1: j=++i;
и
2: j=i++;
то в первом случае инкрементитруется на единицу значение i и потом полученное значение присваивается двум переменным — i и j.
Во втором случае текущее значение i присваивается переменной j, а потом инкрементитруется на единицу значение i и присваивается обратно переменной i. об этом и говорит декомпилятор.
Если на вход каждой операции подать i = 0, то на выходе будет следующее в каждом случае:
1: i = 1, j = 1
2: i = 1, j = 0
Итак, что же сравнивать теперь?
Re[4]: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, Blazkowicz, Вы писали:
IK>>однако на моей машине это даёт ~+8% B>После JIT компиляции?
После JIT компиляции разницы остаться не должно. В байткоде разница есть, но если засунуть все эти операции в регистры, то разницы в длинне нэйтивного кода быть не должно. Тут либо JIT недооптимизировал, либо случайные флуктуации.
Здравствуйте, Blazkowicz, Вы писали:
B>После JIT компиляции?
кстати сделал десяток прогонов на рабочей машине (P4 3.0 HT, java 6_12) — и всё равно ++i быстрее примерно на те же 8%
если запускать как -server, то оба варианта ускоряются и разрыв слегка уменьшается — до 5%.
Re[7]: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, Ildar Karimov, Вы писали:
IK>>>однако на моей машине это даёт ~+8% R>>Тест в студию?
IK>
IK>public class IncDecTest {
IK> public static void main(String[] args) {
IK> Integer i=0;
IK> Integer j=0;
IK> long start = System.currentTimeMillis();
IK> for (long k=0; k<200000000; k++){
IK>// j=i++;
IK> j=++i;
IK> }
IK> long finish = System.currentTimeMillis();
IK> System.out.println(finish-start);
IK> System.out.println(j);
IK> }
IK>}
IK>
И есть реальные проекты, где встречается подобный код? Если даже в полностью синтетическом тесте, не имеющим никакого отношения к реальности, выигрыш всего в восемь процентов, есть ли смысл заморачиваться?
Ну или если хочется очень быстро, то надо работать с примитивами.
Re[7]: Что быстрее: j=++i или j=i++, если i,j - Integer
Здравствуйте, Donz, Вы писали:
D>И есть реальные проекты, где встречается подобный код?
ну вот этого я не знаю — мои строки были чисто выдуманными
D>есть ли смысл заморачиваться?
смысл теста — исключительно ради интереса
D>Ну или если хочется очень быстро, то надо работать с примитивами.
ну это-то я и не отрицаю