Что быстрее: j=++i или j=i++, если i,j - Integer
От: Ildar Karimov Россия  
Дата: 16.03.09 20:37
Оценка: :)
и, главное, почему тот или иной вариант быстрее?
Re: Что быстрее: j=++i или j=i++, если i,j - Integer
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 16.03.09 21:02
Оценка:
Здравствуйте, Ildar Karimov, Вы писали:

IK>и, главное, почему тот или иной вариант быстрее?

Практически: в Java на таких вшей спидометры не прицепишь.
Теоретически: каждая запись генерирует одинаковое количество инструкций.
Вы стебаетесь или шутки из C++ вспоминаете?
Re[2]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Sergey Astakhov Россия  
Дата: 16.03.09 21:12
Оценка:
Здравствуйте, 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

java.lang.Integer m1(java.lang.Integer);
Code:
0: iconst_0
1: invokestatic #2; //Method java/lang/Integer.valueOfI)Ljava/lang/Integer;
4: astore_2
5: aload_1
6: invokevirtual #3; //Method java/lang/Integer.intValue)I
9: iconst_1
10: iadd
11: invokestatic #2; //Method java/lang/Integer.valueOfI)Ljava/lang/Integer;
14: dup
15: astore_1
16: astore_2
17: aload_2
18: areturn

java.lang.Integer m2(java.lang.Integer);
Code:
0: iconst_0
1: invokestatic #2; //Method java/lang/Integer.valueOfI)Ljava/lang/Integer;
4: astore_2
5: aload_1
6: astore_3
7: aload_1
8: invokevirtual #3; //Method java/lang/Integer.intValue)I
11: iconst_1
12: iadd
13: invokestatic #2; //Method java/lang/Integer.valueOfI)Ljava/lang/Integer;
16: dup
17: astore_1
18: astore 4
20: aload_3
21: astore_2
22: aload_2
23: areturn
}


Правый хвост длиннее!
Re[2]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Ildar Karimov Россия  
Дата: 16.03.09 21:21
Оценка: 1 (1)
Здравствуйте, 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
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 16.03.09 22:00
Оценка:
Здравствуйте, 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
От: Ildar Karimov Россия  
Дата: 16.03.09 22:14
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Ага, не заметил, что речь про объекты, а не примитивы.

ага

R>Ага, как и выше процитировали, аж на 2 инструкции чтения/записи больше. Тем не менее, сомнения что это отразиться на исполнении кода в стиле "быстрее-медленее".


однако на моей машине это даёт ~+8%
Re: Что быстрее: j=++i или j=i++, если i,j - Integer
От: stasukas  
Дата: 17.03.09 07:08
Оценка: 1 (1) +1
Здравствуйте, Ildar Karimov, Вы писали:

IK>и, главное, почему тот или иной вариант быстрее?


О чем спор? эти инструкции не равнозначны, т.к. приводят к разному результату на выходе. Читайте мануалы.
Re[5]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 17.03.09 07:08
Оценка:
Здравствуйте, Ildar Karimov, Вы писали:

IK>однако на моей машине это даёт ~+8%

Тест в студию?
Re[6]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 17.03.09 07:10
Оценка:
Здравствуйте, rsn81, Вы писали:

IK>>однако на моей машине это даёт ~+8%

R>Тест в студию?
Забавно, статья только в кеше Google осталась: Eye on performance: Micro performance benchmarking. Bytecode offers a glimpse into application performance.
Re[5]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Blazkowicz Россия  
Дата: 17.03.09 07:13
Оценка: 1 (1) +1
Здравствуйте, Ildar Karimov, Вы писали:

IK>однако на моей машине это даёт ~+8%

После JIT компиляции?

Очередное доказетельство что автобоксинг дает много простора для создания кривого кода, теми кто слабо представляет что это такое.
Re[6]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Ildar Karimov Россия  
Дата: 17.03.09 07:26
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Ildar Karimov, Вы писали:


IK>>однако на моей машине это даёт ~+8%

R>Тест в студию?


public class IncDecTest {
    public static void main(String[] args) {
        Integer i=0;
        Integer j=0;
        long start = System.currentTimeMillis();
        for (long k=0; k<200000000; k++){
//            j=i++;
            j=++i;
        }
        long finish = System.currentTimeMillis();
        System.out.println(finish-start);
        System.out.println(j);
    }
}


java version "1.5.0_16"
core duo 1.83
Re[3]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: stasukas  
Дата: 17.03.09 07:43
Оценка: 2 (2)
Здравствуйте, 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
От: stasukas  
Дата: 17.03.09 08:00
Оценка:
в догонку немного мануалов по префиксным и постфиксным операторам:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#36254
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#39547
Re[6]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: mkizub Литва http://symade.tigris.org
Дата: 17.03.09 08:29
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

IK>>однако на моей машине это даёт ~+8%

B>После JIT компиляции?

После JIT компиляции разницы остаться не должно. В байткоде разница есть, но если засунуть все эти операции в регистры, то разницы в длинне нэйтивного кода быть не должно. Тут либо JIT недооптимизировал, либо случайные флуктуации.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[6]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Ildar Karimov Россия  
Дата: 17.03.09 09:00
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>После JIT компиляции?


кстати сделал десяток прогонов на рабочей машине (P4 3.0 HT, java 6_12) — и всё равно ++i быстрее примерно на те же 8%
если запускать как -server, то оба варианта ускоряются и разрыв слегка уменьшается — до 5%.
Re[7]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Donz Россия http://donz-ru.livejournal.com
Дата: 17.03.09 09:52
Оценка:
Здравствуйте, 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
От: Blazkowicz Россия  
Дата: 17.03.09 10:02
Оценка: 6 (1)
Здравствуйте, Ildar Karimov, Вы писали:

R>>Тест в студию?

IK>java version "1.5.0_16"
IK>core duo 1.83

http://blogs.sun.com/vmrobot/entry/microbenchmarking_hotspot
http://blogs.sun.com/vmrobot/entry/%D0%BF%D0%BE%D0%BC%D0%BD%D0%B8%D1%82%D0%B5_%D0%BE%D0%B1_%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8
Re[7]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Blazkowicz Россия  
Дата: 17.03.09 10:03
Оценка:
Здравствуйте, Ildar Karimov, Вы писали:

IK>
IK>        long start = System.currentTimeMillis();
IK>        long finish = System.currentTimeMillis();
IK>

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime()
Re[8]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Ildar Karimov Россия  
Дата: 17.03.09 13:19
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime()


да знаю я про нанотайм, но я ж не на 10 итерациях считаю, а на ~20-30-секундном тесте
Re[8]: Что быстрее: j=++i или j=i++, если i,j - Integer
От: Ildar Karimov Россия  
Дата: 17.03.09 13:21
Оценка:
Здравствуйте, Donz, Вы писали:

D>И есть реальные проекты, где встречается подобный код?

ну вот этого я не знаю — мои строки были чисто выдуманными

D>есть ли смысл заморачиваться?

смысл теста — исключительно ради интереса

D>Ну или если хочется очень быстро, то надо работать с примитивами.

ну это-то я и не отрицаю
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.