Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > (x ? thinLess:0.0f)


Автор: Rickert 4.5.2008, 05:10
Конструкция типа (x ? thinLess:0.0f) - во что она преобразуется?
Допустим у меня такой код:
Код
 for (int i = 0; i < 1000; ++i)
{
  x += (xx ? thinLess:0.0f);
  z += (zz ? 0.0f:thinLess);
}

Что будет быстрее он или:
Код

int xp = (xx ? thinLess:0.0f);
int zp = (zz ? 0.0f:thinLess);
for (int i = 0; i < 1000; ++i)
{
  x += xp;
  z += zp;
}


Автор: t_gran 4.5.2008, 06:17
GCC при оптимизации 2 (-02) генерирует один и тот же код
Код

    .text
    .p2align 2,,3
.globl main
    .type    main, @function
main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $8, %esp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $999, %eax
    .p2align 2,,3
.L9:
    decl    %eax
    jns    .L9
    xorl    %eax, %eax
    leave
    ret
    .size    main, .-main
    .ident    "GCC: (GNU) 3.4.4 [FreeBSD] 20050518"

Но если без оптимизации, то сам посмотри, что добавляется ещё одна метка. smile

1-ый вариант
Код

    .file    "1.c"
    .text
    .p2align 2,,3
.globl main
    .type    main, @function
main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $72, %esp
    andl    $-16, %esp
    movl    $0, %eax
    addl    $15, %eax
    addl    $15, %eax
    shrl    $4, %eax
    sall    $4, %eax
    subl    %eax, %esp
    movl    $-1717986918, %eax
    movl    $1069128089, %edx
    movl    %eax, -8(%ebp)
    movl    %edx, -4(%ebp)
    movl    $0, -28(%ebp)
.L2:
    cmpl    $999, -28(%ebp)
    jg    .L3
    fildl    -20(%ebp)
    fstpl    -48(%ebp)
    cmpl    $0, -12(%ebp)
    je    .L5
    fldl    -48(%ebp)
    faddl    -8(%ebp)
    fnstcw    -30(%ebp)
    movw    -30(%ebp), %ax
    movb    $12, %ah
    movw    %ax, -32(%ebp)
    fldcw    -32(%ebp)
    fistpl    -52(%ebp)
    fldcw    -30(%ebp)
    jmp    .L6
.L5:
    fldz
    faddl    -48(%ebp)
    fnstcw    -30(%ebp)
    movw    -30(%ebp), %ax
    movb    $12, %ah
    movw    %ax, -32(%ebp)
    fldcw    -32(%ebp)
    fistpl    -52(%ebp)
    fldcw    -30(%ebp)
.L6:
    movl    -52(%ebp), %eax
    movl    %eax, -20(%ebp)
    fildl    -24(%ebp)
    fstpl    -64(%ebp)
    cmpl    $0, -16(%ebp)
    jne    .L7
    fldl    -64(%ebp)
    faddl    -8(%ebp)
    fldcw    -32(%ebp)
    fistpl    -68(%ebp)
    fldcw    -30(%ebp)
    jmp    .L8
.L7:
    fldz
    faddl    -64(%ebp)
    fldcw    -32(%ebp)
    fistpl    -68(%ebp)
    fldcw    -30(%ebp)
.L8:
    movl    -68(%ebp), %eax
    movl    %eax, -24(%ebp)
    leal    -28(%ebp), %eax
    incl    (%eax)
    jmp    .L2
.L3:
    movl    $0, %eax
    leave
    ret
    .size    main, .-main
    .ident    "GCC: (GNU) 3.4.4 [FreeBSD] 20050518"


2-ой вариант
Код

    .file    "2.c"
    .text
    .p2align 2,,3
.globl main
    .type    main, @function
main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $56, %esp
    andl    $-16, %esp
    movl    $0, %eax
    addl    $15, %eax
    addl    $15, %eax
    shrl    $4, %eax
    sall    $4, %eax
    subl    %eax, %esp
    movl    $-1717986918, %eax
    movl    $1069128089, %edx
    movl    %eax, -8(%ebp)
    movl    %edx, -4(%ebp)
    cmpl    $0, -12(%ebp)
    je    .L2
    fldl    -8(%ebp)
    fnstcw    -38(%ebp)
    movw    -38(%ebp), %ax
    movb    $12, %ah
    movw    %ax, -40(%ebp)
    fldcw    -40(%ebp)
    fistpl    -48(%ebp)
    fldcw    -38(%ebp)
    jmp    .L3
.L2:
    movl    $0, -48(%ebp)
.L3:
    movl    -48(%ebp), %eax
    movl    %eax, -32(%ebp)
    cmpl    $0, -16(%ebp)
    jne    .L4
    fldl    -8(%ebp)
    fnstcw    -38(%ebp)
    movw    -38(%ebp), %ax
    movb    $12, %ah
    movw    %ax, -40(%ebp)
    fldcw    -40(%ebp)
    fistpl    -52(%ebp)
    fldcw    -38(%ebp)
    jmp    .L5
.L4:
    movl    $0, -52(%ebp)
.L5:
    movl    -52(%ebp), %eax
    movl    %eax, -36(%ebp)
    movl    $0, -28(%ebp)
.L6:
    cmpl    $999, -28(%ebp)
    jg    .L7
    movl    -32(%ebp), %edx
    leal    -20(%ebp), %eax
    addl    %edx, (%eax)
    movl    -36(%ebp), %edx
    leal    -24(%ebp), %eax
    addl    %edx, (%eax)
    leal    -28(%ebp), %eax
    incl    (%eax)
    jmp    .L6
.L7:
    movl    $0, %eax
    leave
    ret
    .size    main, .-main
    .ident    "GCC: (GNU) 3.4.4 [FreeBSD] 20050518"



Добавлено через 4 минуты и 12 секунд
Естественно это сильно от компилятора зависит smile

Автор: JackYF 4.5.2008, 12:04
Логично, что всё, что не зависит от переменной цикла, лучше выносить за пределы этого самого цикла.

Автор: Rickert 4.5.2008, 20:10
Подожду ещё мнений.
Работаю на VS.
Спасибо!

Автор: bsa 5.5.2008, 11:20
Rickert, а чего их ждать? есть понятия оптимизация и пессимизация. И если оптимизация вредна только преждевременная, то пессимизация, на мой взгляд, вредна любая необоснованная. У тебя в первом примере именно пессимизация кода. Хорошо, если компилятор умный и может исправить твой косяк, но если это не так? Да и читабельность кода тот подход только понизил, на мой взгляд.

Автор: mes 5.5.2008, 19:20
Цитата(bsa @  5.5.2008,  11:20 Найти цитируемый пост)
есть понятия оптимизация и пессимизация. 

 smile 
Но я заметил странное явление  - о пессимизации говорят редко. Всегда пугают лишь преждевременной оптимизацией,
 узнав о вреде которой люди начинают специально писать пессимизировано.

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




Автор: bsa 5.5.2008, 22:28
Цитата(mes @ 5.5.2008,  19:20)
Но на самом деле в коде надо избегать не пессимизацию и оптимизацию, а неясность и двусмысленность кода.
А если быть точнее, то надо просто стараться выразиться ясней и понятней , и тогда не придется ничего избегать. ))

Преждевременная оптимизация лежит на повержности. И руки тянутся ее сделать, особенно, у программистов, которые имеют небольшой опыт.
С пессимизацией сложнее. Думаю, на нее напарываются только новички или "программисты", которые пишут не думая о том, что они пишут.

Автор: Rickert 6.5.2008, 07:00
Да мне пофиг на то, как какому будет читать мой код, у меня другой вопрос: что работает быстрее? Судя по дизасму одинаково.

Автор: vinter 6.5.2008, 08:35
Цитата(Rickert @  6.5.2008,  08:00 Найти цитируемый пост)
Да мне пофиг на то, как какому будет читать мой код,

очень плохо, если не изменишь свое мнение то врядли работу себе нормальную найдешь...
Цитата(Rickert @  6.5.2008,  08:00 Найти цитируемый пост)
что работает быстрее?

ясен пень одинаково, ты приведи пример еще поэлементарней, для чего компиляторы улучшают? чтобы оптимизировали лучше smile

Автор: bsa 6.5.2008, 10:43
Цитата(Rickert @ 6.5.2008,  07:00)
Да мне пофиг на то, как какому будет читать мой код

Почитай умные книжки.
Только что, ты сказал полную противоположность тому, что есть на самом деле. Ты не только выразил неуважение к другим программистам, но и к себе в первую очередь, так как этот код ты будешь читать сам через пол года с воплями: "Кто так пишет?!?".

Автор: mes 6.5.2008, 11:13
Цитата(Rickert @  6.5.2008,  07:00 Найти цитируемый пост)
Да мне пофиг на то, как какому будет читать мой код, 

я так понял, что это высказывание относится к фразе 
Цитата(mes @  5.5.2008,  19:20 Найти цитируемый пост)
надо просто стараться выразиться ясней и понятней 

Она НЕ означает,  что надо писать программу так чтоб понял стороний наблюдатель.

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





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)