
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.129] |
![]() |
|
Страницы: (29) « Первая ... 4 5 [6] 7 8 ... 28 29 ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
Последние данные. helloworld.exe - 2560 байт, a.out - 2932 байта (gcc -O2 -fomit-frame-pointer -S helloworld.c после чего strip a.out). ![]() Цитата the_Shadow @ Взяли. И что дальше? Зачем нужна оптимизация, если он и так достаточно оптимален? Или, будем оптимизировать уже соптимизированное? Оптимален говоришь? Это для того, чтобы мне отсортировать последовательность из 1024 интов мне надо будет сделать 10 * 1024 косвенного вызова компаратора? Ну-ну. ![]() Добавлено Цитата the_Shadow @ Fleeeex... Ну не в Linux это. В M$ я не лезу -- это отдельный вопрос. Ну не катит такой подход в Linux. Какой подход? Ты о чем? Или ты считаешь, что все фичи плюсов - это придумка Microsoft? |
Сообщ.
#77
,
|
|
|
:D:D:D
Цитата Не, я не против писания под Linux, я против тех методов, которыми это привыкли делать :) Препроцессор блин :P А тя кто-то спрашивал как это делать? Учитель, блин... :D:D:D Работает? Работает. :D:D:D И чего ещё надо? по-написать шаблонов, чтобы через них выражать сущности ядра? Бред, по-моему... :D:D:D ![]() ![]() .file "test.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "Hello world" .text .p2align 2,,3 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp subl $28, %esp pushl $.LC0 call puts xorl %eax, %eax leave ret .size main, .-main .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)" CentOS 4-какая-то... Это и выше -- то, что в ней получилось. |
Сообщ.
#78
,
|
|
|
Цитата the_Shadow @ А теперь сделай над собой усилие и по-пробуй то же под lcc. Я серьёзно говорю. ![]() При всем желании попробовать не смогу, ибо оным инструментом не обладаю. Добавлено Цитата the_Shadow @ CentOS 4-какая-то... Это и выше -- то, что в ней получилось. Кстати, а расскажи мне, почему в групповых опциях оптимизации (O2, O3) не предусмотрено включение флага omit-frame-pointer и для получение кода еще меньшего размера приходится его указывать "руками"? |
Сообщ.
#79
,
|
|
|
А почему даже такая прога имеет размер 3 кб?
![]() ![]() void main() { } Откуда берется столько кода, если она ничего не делает? |
Сообщ.
#80
,
|
|
|
Цитата plan699 @ А почему даже такая прога имеет размер 3 кб? Фишка в другом. Исполняемый файл в windows поделен на секции. Каждая секция выравнивается по границе определенного значения (которая указывается в опции ALIGN). По умолчанию там используется значение 4096 байт. При уменьшении этого значения уменьшается и размер исполняемого файла. При определенных значениях файл может перестать запускаться. Добавлено Например, при значении 16 размер исполняемого файла составляет 1424 байта. При желании этот размер можно еще уменьшить, но в данном случае это бессмысленно. |
Сообщ.
#81
,
|
|
|
В линуксе эта прога имеет размер 2852 б. В windows с align 16 2080 б. В линуксе файл тоже поделен на секции?
|
Сообщ.
#82
,
|
|
|
Цитата plan699 @ В линуксе эта прога тоже имеет размер около 3 кб. Там тоже файл поделен на секции? А это пусть тебе Шад расскажет. Я не в курсах. |
Сообщ.
#83
,
|
|
|
Цитата Оптимален говоришь? Это для того, чтобы мне отсортировать последовательность из 1024 интов мне надо будет сделать 10 * 1024 косвенного вызова компаратора? Ну-ну. :) Ииии... Что? Ну и Бог бы с ним. Зачем чинить то, что и без того работает? Кроме того, компиль ещё "внесёт свою лепту". Цитата Какой подход? Ты о чем? Или ты считаешь, что все фичи плюсов - это придумка Microsoft? Я считаю, что только в M$-мире программисты решают те задачи, которых не существует. Причём, в природе. :D:D:D Чтобы разобраться с проблемой, давай-ка, если можно, заделай код с "шаблончиками" (только давай не сложный, ладно?), я готов реализовать функциональный аналог на С. И посмотрим выводы там. Да, кстати, а как там с lcc? Дома могу развлечься и отписать... :D:D:D Цитата Последние данные. helloworld.exe - 2560 байт, a.out - 2932 байта (gcc -O2 -fomit-frame-pointer -S helloworld.c после чего strip a.out). Воспроизвожу свой результат. Опции компилятора -- те же (собственно, добавлен только -fomit-frame-pointer). Размер -- 2908. |
Сообщ.
#84
,
|
|
|
1424 байта у меня не получается, 2080 c align 16
Это в какой студии 1424, и для этой проги или с выводом Hello world? ![]() ![]() void main() { } |
Сообщ.
#85
,
|
|
|
Цитата BugHunter @ Не, я не против писания под Linux, я против тех методов, которыми это привыкли делать ![]() s/Linux/Windows/ Все-таки криворуких кодеров в винде больше. Уж не буду упоминать об "изящных" тулкитах вроде MFC. По сравнению с этим убожеством даже объекты на C (glib, gtk) смотрятся очень естественно и непринужденно. |
Сообщ.
#86
,
|
|
|
Цитата При всем желании попробовать не смогу, ибо оным инструментом не обладаю. Делюсь! :D:D:D http://www.cs.virginia.edu/~lcc-win32/ Если не качать Win 32 API help, то там не много. :D:D:D Воткнёт, отвечаю. Только там С++ нет. И ряд задач (типа Control Panel Applet реализовывать зае*ся. Но возможно... Рекомендую по-пробовать. И потом сравнить пути решения в Visual и lcc. Это к вопросу о "рекомендуемой" M$ среде разработки. Добавлено Цитата А это пусть тебе Шад расскажет. Я не в курсах. Если весьма грубо, то да. Файл поделён на секции. Правда, исполняемые файлы разных форматов. В windoZe -- COFF (Common-Object File Format), а в Linux -- ELF (не помню расшифровку, но он достаточно хорошо документирован). Кроме того, старый *NIX-формат a.out это то же COFF. |
Сообщ.
#87
,
|
|
|
Цитата plan699 @ 1424 байта у меня не получается, 2080 c align 16 Это в какой студии 1424? VC 7.1 Цитата the_Shadow @ Ииии... Что? Ну и Бог бы с ним. Зачем чинить то, что и без того работает? Кроме того, компиль ещё "внесёт свою лепту". Кто-то тут про оптимизацию кричал. Или "тут играем, тут не играем, тут я рыбу заворачивал"? Или косвенный вызов (call [xxx]) - это достаточно оптимальная замена одного mov и одного cmp? Цитата the_Shadow @ Я считаю, что только в M$-мире программисты решают те задачи, которых не существует. Причём, в природе. ![]() Приведи пример. Цитата the_Shadow @ Чтобы разобраться с проблемой, давай-ка, если можно, заделай код с "шаблончиками" (только давай не сложный, ладно?), я готов реализовать функциональный аналог на С. И посмотрим выводы там. По какому критерию сравнивать будем? Цитата the_Shadow @ Да, кстати, а как там с lcc? Дома могу развлечься и отписать... ![]() Давай. Цитата the_Shadow @ Воспроизвожу свой результат. Опции компилятора -- те же (собственно, добавлен только -fomit-frame-pointer). Размер -- 2908. Вдвое превышает мой последний (1424 байта). |
Сообщ.
#88
,
|
|
|
Цитата the_Shadow @ Ииии... Что? Ну и Бог бы с ним. Зачем чинить то, что и без того работает? Кроме того, компиль ещё "внесёт свою лепту". Ничего он не внесет. Шаблонная сортировка C++ многократно уделает сортировку с использованием qsort на C. В отдельных случаях шаблоны и правда замечательный инструмент, но, поскольку тема началась с обсуждения исходников linux kernel, то всех кричащих "C++ forever!" надо бы отослать к исходникам столь любимого ими boost'а. Язык, на котором можно написать такое определенно не предназначен для того, чтобы люди писали на нем сложные приложения, но... Ежики плакали, кололись и продолжали лопать свой любимый кактус. |
Сообщ.
#89
,
|
|
|
Цитата linuxfan @ поскольку тема началась с обсуждения исходников linux kernel, то всех кричащих "C++ forever!" надо бы отослать к исходникам столь любимого ими boost'а. Язык, на котором можно написать такое определенно не предназначен для того, чтобы люди писали на нем сложные приложения Я бы показал тебе сложные приложения на С++, написанные с использованием того же boost'а. Если имел право (которого у меня нет) демонстрировать исходники. ![]() А исходники boost'а - да. Это сильно и сложно. Но врядли сложнее ядра линукса. Точно также, как и для ядра, в команде буста есть свои правила и соглашения по оформлению исходных текстов, и в них есть своя внутренняя логика. Так что пример не совсем уместный. |
Сообщ.
#90
,
|
|
|
Flex, давай проще (про qsort).
Вот код (правда. там warning есть, но он компилится в принципе): ![]() ![]() #include <stdlib.h> #define MAX_ARR 1024 int arr[MAX_ARR]; int n; static int comp_func( int *a, int *b ) { if( *a < *b ) { return( -1 ); } else if( *b < *a ) { return( 1 ); } return( 0 ); } int main( int argc, char *argv[] ) { qsort( arr, n, sizeof( int ), comp_func ); return 0; } С указанными выше опциями асм-вывод: ![]() ![]() .file "helloworld.c" .text .p2align 2,,3 .type comp_func, @function comp_func: movl 4(%esp), %eax movl (%eax), %edx movl 8(%esp), %eax movl (%eax), %eax cmpl %eax, %edx movl $-1, %ecx jl .L1 xorl %ecx, %ecx cmpl %edx, %eax setl %cl .L1: movl %ecx, %eax ret .size comp_func, .-comp_func .p2align 2,,3 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp subl $16, %esp pushl $comp_func pushl $4 pushl n pushl $arr call qsort xorl %eax, %eax leave ret .size main, .-main .comm arr,4096,32 .comm n,4,4 .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)" Размер результирующего кода (после strip'а) -- 2992. Добавлено Цитата Кто-то тут про оптимизацию кричал. Или "тут играем, тут не играем, тут я рыбу заворачивал"? Или косвенный вызов (call [xxx]) - это достаточно оптимальная замена одного mov и одного cmp? Комментировать, или не стоит? Добавлено Цитата Приведи пример. ~80% ПО. Вспоминаем про 20|80. Цитата Ничего он не внесет. Шаблонная сортировка C++ многократно уделает сортировку с использованием qsort на C. А давайте что ли, к коду? Добавлено Теперь, как неуюёмный, делаю as helloworld.s, получаю 912 байт и, после стрипования, получаю 548 байт. Flex, ты всё ещё оптимизируешь? :D:D:D Тогда мы идём к Вам! :D:D:D |