На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (29) « Первая ... 4 5 [6] 7 8 ...  28 29  ( Перейти к последнему сообщению )  
> Вопрос к программистам на C , Исходники ядра Linux
    Цитата the_Shadow @
    Не-а... -O2 -S дают 4688, после strip test получается 2908 (байт).

    Последние данные. helloworld.exe - 2560 байт, a.out - 2932 байта (gcc -O2 -fomit-frame-pointer -S helloworld.c после чего strip a.out). :tong:

    Цитата the_Shadow @
    Взяли. И что дальше? Зачем нужна оптимизация, если он и так достаточно оптимален? Или, будем оптимизировать уже соптимизированное?

    Оптимален говоришь? Это для того, чтобы мне отсортировать последовательность из 1024 интов мне надо будет сделать 10 * 1024 косвенного вызова компаратора? Ну-ну. :)

    Добавлено
    Цитата the_Shadow @
    Fleeeex... Ну не в Linux это. В M$ я не лезу -- это отдельный вопрос. Ну не катит такой подход в Linux.

    Какой подход? Ты о чем? Или ты считаешь, что все фичи плюсов - это придумка Microsoft?
      :D:D:D
      Цитата
      Не, я не против писания под Linux, я против тех методов, которыми это привыкли делать :)
      Препроцессор блин :P

      А тя кто-то спрашивал как это делать? Учитель, блин... :D:D:D Работает? Работает.
      :D:D:D

      И чего ещё надо? по-написать шаблонов, чтобы через них выражать сущности ядра? Бред, по-моему... :D:D:D
      ExpandedWrap disabled
            .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-какая-то... Это и выше -- то, что в ней получилось.
        Цитата the_Shadow @
        А теперь сделай над собой усилие и по-пробуй то же под lcc. Я серьёзно говорю. :D:D:D

        При всем желании попробовать не смогу, ибо оным инструментом не обладаю.

        Добавлено
        Цитата the_Shadow @
        CentOS 4-какая-то... Это и выше -- то, что в ней получилось.

        Кстати, а расскажи мне, почему в групповых опциях оптимизации (O2, O3) не предусмотрено включение флага omit-frame-pointer и для получение кода еще меньшего размера приходится его указывать "руками"?
          А почему даже такая прога имеет размер 3 кб?
          ExpandedWrap disabled
            void main()
            {
            }

          Откуда берется столько кода, если она ничего не делает?
          Сообщение отредактировано: plan699 -
            Цитата plan699 @
            А почему даже такая прога имеет размер 3 кб?

            Фишка в другом. Исполняемый файл в windows поделен на секции. Каждая секция выравнивается по границе определенного значения (которая указывается в опции ALIGN). По умолчанию там используется значение 4096 байт. При уменьшении этого значения уменьшается и размер исполняемого файла. При определенных значениях файл может перестать запускаться.

            Добавлено
            Например, при значении 16 размер исполняемого файла составляет 1424 байта. При желании этот размер можно еще уменьшить, но в данном случае это бессмысленно.
              В линуксе эта прога имеет размер 2852 б. В windows с align 16 2080 б. В линуксе файл тоже поделен на секции?
              Сообщение отредактировано: plan699 -
                Цитата plan699 @
                В линуксе эта прога тоже имеет размер около 3 кб. Там тоже файл поделен на секции?

                А это пусть тебе Шад расскажет. Я не в курсах.
                  Цитата
                  Оптимален говоришь? Это для того, чтобы мне отсортировать последовательность из 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.
                    1424 байта у меня не получается, 2080 c align 16
                    Это в какой студии 1424, и для этой проги или с выводом Hello world?
                    ExpandedWrap disabled
                      void main()
                      {
                      }
                    Сообщение отредактировано: plan699 -
                      Цитата BugHunter @
                      Не, я не против писания под Linux, я против тех методов, которыми это привыкли делать :)

                      s/Linux/Windows/
                      Все-таки криворуких кодеров в винде больше.
                      Уж не буду упоминать об "изящных" тулкитах вроде MFC. По сравнению с этим убожеством даже объекты на C (glib, gtk) смотрятся очень естественно и непринужденно.
                        Цитата
                        При всем желании попробовать не смогу, ибо оным инструментом не обладаю.

                        Делюсь! :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.
                          Цитата plan699 @
                          1424 байта у меня не получается, 2080 c align 16
                          Это в какой студии 1424?

                          VC 7.1

                          Цитата the_Shadow @
                          Ииии... Что? Ну и Бог бы с ним. Зачем чинить то, что и без того работает? Кроме того, компиль ещё "внесёт свою лепту".

                          Кто-то тут про оптимизацию кричал. Или "тут играем, тут не играем, тут я рыбу заворачивал"? Или косвенный вызов (call [xxx]) - это достаточно оптимальная замена одного mov и одного cmp?

                          Цитата the_Shadow @
                          Я считаю, что только в M$-мире программисты решают те задачи, которых не существует. Причём, в природе. :D:D:D

                          Приведи пример.

                          Цитата the_Shadow @
                          Чтобы разобраться с проблемой, давай-ка, если можно, заделай код с "шаблончиками" (только давай не сложный, ладно?), я готов реализовать функциональный аналог на С. И посмотрим выводы там.

                          По какому критерию сравнивать будем?

                          Цитата the_Shadow @
                          Да, кстати, а как там с lcc? Дома могу развлечься и отписать... :D:D:D

                          Давай.

                          Цитата the_Shadow @
                          Воспроизвожу свой результат. Опции компилятора -- те же (собственно, добавлен только -fomit-frame-pointer). Размер -- 2908.

                          Вдвое превышает мой последний (1424 байта).
                            Цитата the_Shadow @
                            Ииии... Что? Ну и Бог бы с ним. Зачем чинить то, что и без того работает? Кроме того, компиль ещё "внесёт свою лепту".

                            Ничего он не внесет. Шаблонная сортировка C++ многократно уделает сортировку с использованием qsort на C. В отдельных случаях шаблоны и правда замечательный инструмент, но, поскольку тема началась с обсуждения исходников linux kernel, то всех кричащих "C++ forever!" надо бы отослать к исходникам столь любимого ими boost'а. Язык, на котором можно написать такое определенно не предназначен для того, чтобы люди писали на нем сложные приложения, но... Ежики плакали, кололись и продолжали лопать свой любимый кактус.
                              Цитата linuxfan @
                              поскольку тема началась с обсуждения исходников linux kernel, то всех кричащих "C++ forever!" надо бы отослать к исходникам столь любимого ими boost'а. Язык, на котором можно написать такое определенно не предназначен для того, чтобы люди писали на нем сложные приложения

                              Я бы показал тебе сложные приложения на С++, написанные с использованием того же boost'а. Если имел право (которого у меня нет) демонстрировать исходники. :) (Ээээ, это не повод для очередного холивара!!!)
                              А исходники boost'а - да. Это сильно и сложно. Но врядли сложнее ядра линукса. Точно также, как и для ядра, в команде буста есть свои правила и соглашения по оформлению исходных текстов, и в них есть своя внутренняя логика. Так что пример не совсем уместный.
                                Flex, давай проще (про qsort).
                                Вот код (правда. там warning есть, но он компилится в принципе):
                                ExpandedWrap disabled
                                  #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;
                                  }

                                С указанными выше опциями асм-вывод:
                                ExpandedWrap disabled
                                      .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
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (29) « Первая ... 4 5 [6] 7 8 ...  28 29


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0437 ]   [ 14 queries used ]   [ Generated: 19.09.25, 04:12 GMT ]