TDM GCC 5,1 медленнее, чем 4,7

Я использую tdm gcc-компиляторы для компиляции моих проектов winapi, когда я тестирую некоторый простой mandebrot sse-код 9maybe с другими проектами, похожими на те же, но я не проверял все), 5.1 генерирует больший исполняемый файл 330 КБ против 270 КБ (хотя я не перекомпилировал все, только горячий модуль петли и связан с уже скомпилированными (в 4.7) модулями, а также замечает более медленный код 23,5 мс / смещение кадра 20 мс в 4,7

Это страшно .. Что я могу с этим сделать? (остальные настройки и т. д. такие же, я только переименую папку компилятора из одного в любой

Я использую c-подобный код, но компилирую в режиме c ++

Может кто-то знает, как это решить? (под разрешением я имею в виду
заставить сборку 5.1 работать как минимум так же быстро, как 4.7, также предпочел бы, чтобы исполняемый файл был меньше)

//редактировать

PS я сделал еще быстрый тест

как я могу скомпилировать модуль цикла в 51 и связать все в 47

цикл компиляции 47, ссылка 47: размер 270 К, скорость 20 мс

цикл компиляции 51 ссылка 51: размер 330 К скорость 23,5 мс

цикл компиляции 47 ссылка 51: размер 330 К скорость 20 мс

цикл компиляции 51, ссылка 47: размер 270 К, скорость 23,5 мс

это показывает, что падение скорости происходит при компиляции в 51
и размер наворота исходит от ссылки 51

2

Решение

Другая версия компилятора C ++ использует другой движок C ++

  • код может быть таким же
  • но двигатель не

C ++ движок

  • отвечает за многие вещи, такие как:

    1. управление памятью (стек, куча, локальные / глобальные / динамические / статические / временные переменные)
    2. шаблон / класс / структура / виртуальное управление
    3. управление указателем
    4. и многое, многое другое
  • Вы можете посмотреть на это как Операционные системы (в некоторых случаях это ОС в основном на платформах MCU)

  • или как посредник между Операционные системы и ваше приложение
  • поэтому более новая версия часто обрабатывает больше вещей одновременно, влияющих на производительность
  • это видно по размеру файла (компоновщик добавляет движок в ваш исполняемый файл)
  • и на производительность влияет в основном интенсивное использование:

    1. динамическое выделение / освобождение памяти
    2. классы
    3. кучи / стека мусор

Другой возможной причиной может быть версия связанных библиотек

  • если вы используете какой-либо lib (например, std …)
  • тогда более новый компилятор / компоновщик может включать их более новую версию (в соответствии с путями включения)
  • что также может повлиять на производительность
  • также, если некоторые библиотеки не могут распознать более новую версию GCC,
  • они могли бы переключиться на более медленный / безопасный код внутри

как вернуть поведение к старому стилю

  • используйте старый компилятор / компоновщик, если вам нужно
  • в более новой версии вы можете использовать более старый двигатель (но это может вызвать проблемы позже)
  • искать файлы как:

    crt0.o
    crtfv.o
    libc.a
    
  • или аналогичные и замените их старыми версиями

  • но это не рекомендуется делать …
0

Другие решения

Я проверил сборку, и она показывает некоторые изменения в сгенерированном коде,
хоть и небольшой

4,7

__Z16mandelbrot_n_sseU8__vectorfS_i:
pushl        %ebp
movl        %esp, %ebp
andl        $-16, %esp
subl        $16, %esp
movl        8(%ebp), %ecx
movaps        %xmm0, (%esp)
testl        %ecx, %ecx
js        L12
xorps        %xmm0, %xmm0
xorl        %eax, %eax
movaps        %xmm0, %xmm2
movaps        %xmm0, %xmm4
jmp        L11
.p2align 4,,7
L19:
mulps        %xmm4, %xmm2
addl        $1, %eax
subps        %xmm5, %xmm6
movaps        (%esp), %xmm4
cmpl        %eax, %ecx
addps        %xmm6, %xmm4
addps        %xmm2, %xmm2
addps        %xmm1, %xmm2
jl        L10
L11:
movaps        %xmm4, %xmm6
movaps        %xmm2, %xmm5
movaps        LC5, %xmm7
mulps        %xmm4, %xmm6
mulps        %xmm2, %xmm5
movaps        %xmm6, %xmm3
addps        %xmm5, %xmm3
cmpltps        LC4, %xmm3
andps        %xmm3, %xmm7
movmskps        %xmm3, %edx
testl        %edx, %edx
addps        %xmm7, %xmm0
jne        L19
L10:
cvtps2dq        %xmm0, %xmm0
leave
ret
L12:
xorps        %xmm0, %xmm0
jmp        L10
.globl        __Z16mandelbrot_n_sseDv4_fS_i

5,1

__Z16mandelbrot_n_sseDv4_fS_i:
pushl        %ebp
movl        %esp, %ebp
andl        $-16, %esp
subl        $16, %esp
movl        8(%ebp), %ecx
movaps        %xmm0, (%esp)
testl        %ecx, %ecx
js        L11
pxor        %xmm0, %xmm0
xorl        %edx, %edx
movaps        %xmm0, %xmm5
movaps        %xmm0, %xmm2
jmp        L10
.p2align 4,,10
L18:
mulps        %xmm2, %xmm5
addl        $1, %edx
subps        %xmm6, %xmm4
cmpl        %edx, %ecx
addps        %xmm5, %xmm5
addps        (%esp), %xmm4
addps        %xmm1, %xmm5
jl        L9
movaps        %xmm4, %xmm2
L10:
movaps        %xmm2, %xmm4
movaps        %xmm5, %xmm6
movaps        LC7, %xmm7
mulps        %xmm2, %xmm4
mulps        %xmm5, %xmm6
movaps        %xmm4, %xmm3
addps        %xmm6, %xmm3
cmpltps        LC6, %xmm3
andps        %xmm3, %xmm7
movmskps        %xmm3, %eax
testl        %eax, %eax
addps        %xmm7, %xmm0
jne        L18
L9:
cvtps2dq        %xmm0, %xmm0
leave
ret
L11:
pxor        %xmm0, %xmm0
jmp        L9
.section        .text.unlikely,"x"LCOLDE8:
.text

Кажется, что версия 5.1 не повезло, и это cst 15% замедление

0

По вопросам рекламы [email protected]