|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Andrey Melnikoff 2:5020/400 12 Nov 2004 00:15:17 To : Alex Korchmar Subject : Re: <none> -------------------------------------------------------------------------------- Alex Korchmar <hue-moe@so.yandex.ru> wrote: > Andrey Melnikoff <temnota+news@kmv.ru> wrote: > AM> Hет, что-то всетаки улучшается. Hапример с -fomit-frame-pointer > AM> gcc перестал даже играть вокруг %esp с %ebp в тех местах, где они > думаешь, это можно заметить? Можно. Если очередной coder написаль процедурку типа long xxx_param(long p1, long p2){ if (p1 > blah-blah && p2 < blah-blah) return p1+p2<<8; } и вызовов в коде - под хреннадцать тысячь. > >> а серьезный прорыв в gcc'шной оптимизации был ровно один и как раз его > >> результаты я и тестировал. > AM> Какой из ? > на самом деле их два было - pgcc и то, имени ibm, но в одно и то же время. > Остальное по сравнению с этим - мелочь, imho. Аааа.. > AM> Я вот -mregparam=3 попробовал попользовать на практике.. Получилась > AM> довольно смешная каша. > в смысле, пользоваться нельзя? кусок кода без -mregparm=3: movl 12(%ebp), %edi incl %edi movl %edi, (%esp) call malloc movl %eax, %esi xorl %eax, %eax testl %esi, %esi je .L124 тот-же кусок кода с -mregparm=3: movl -184(%ebp), %edi incl %edi movl %edi, %eax call malloc movl %eax, %esi xorl %eax, %eax testl %esi, %esi je .L124 как ты думаешь, системный malloc() обучен принимать количествой байтов в %eax? ;) PS: А оптимизатуор вообще песня. Вопервых - непонятна сама причина возьни с %edi, когда есть универсальный %eax. Обрати внимание на возьню с %esi. Код логически ужимается до такого: movl -184(%ebp), %eax incl %eax pushl %eax call malloc addl $2, %esp orl %eax, %eax je .L124 Использовалось: gcc version 3.4.2 (Debian 3.4.2-3) && gcc version 3.3.5 (Debian 1:3.3.5-2) в случае с 3.4.2 и без -mregparm=3 результат получается иногда лучше, за счет того, что оптимизатор придерживает "пробивание дыры в стеке" для локальных переменных. PPS: Cишный код: char *rd(int max_size){ char *buf = NULL; if ((buf = malloc((max_size + 1) * sizeof(char))) == NULL) { return NULL; } ..... } и параметры: -O3 -fno-omit-frame-pointer -Wall -funsigned-bitfields -Wunused -mregparm=3 --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/6438c224a66d.html, оценка из 5, голосов 10
|