Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  07:12[Войти] | [Зарегистрироваться]
Обсуждение темы:
Сравнение компиляторов

Соответствует ли действительности то, что компилятор Object Pascal в Delphi лучше компилятора C++ в C++Builder? Для эксперимента я создал два проекта на С++Builder и Delphi соответственно, и всего навсего в процедуре обрабатывающей нажатие на кноку задал пустой цикл от 1 до 1 миллиарда:

В С++Builder соответсвующая функция выглядела сл. образом:
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 for (int i = 0; i < 1000000000; i++);

}
а в Delphi соответствующая процедура выглядела так:
procedure TForm1.Button1Click(Sender: TObject);

 var i : integer;

begin

 for i:= 0 to 1000000000 do;

end;
И что же оказывается - Программа на Delphi выполняется в 5 раза быстрее(4 сек., а на С++Builder - 20 cек.)! ?? Тогда я решил выяснить в чём разница в конечном коде, генерируемом компиляторами C++Builder и Delphi. Для этого я просто установил точки останова(breakpoint) напротив циклов и во время выполнения заглянул в Debug Windows/CPU и что оказалось:

код сгенерированный компилятором С++Builder, соответсвующий пустому циклу в ассемблерном представлении выглядит сл. образом:
xor edx, edx

mov [ebp-0x34], edx
inc dword ptr [ebp-0x34]
mov ecx, [ebp-0x34]
cmp ecx, 0x3b9aca00
jl -0x0e
А у Delphi получился такой код:
mov edx, $3b9aca00
dec edx
jnz TForm1.Button1Click + $5
Т.О. отсюда уже понятны причины почему программа на Delphi быстрее выполняется. Помимо того что бросается в глаза большее количество команд видно ещё принципиальное отличие - в коде первой программы в качестве переменной-счётчика используется ячейка памяти, а компилятор Delphi сгенерировал код в котором используется регистр процессора в качестве счётчика. Хорошо, можно и устранить последнее отличее сл. образом:
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 for (register int i = 0; i < 1000000000; i++);

},
т.е. перед переменной-счётчиком i указали спецификатор register, предварительно в настройках компилятора разрешив использование Register Variables(Project/Options/Advanced Compiler/Register Variables). Действительно тогда код сгенерированный компилятором С++Builder изменится к виду:
mov eax, 0x3b9aca00
dec eax
test eax, eax
jnle -0x05
Как видим теперь уже почти не отличается от кода сгенерированного компилятором Delphi! За исключением одной лишней команды - test eax, eax(зачем она нужна??) и команды jnle вместо jnz. Вот за счёт этой лишней команды test eax, eax, кот. выполняется в цикле и увеличивается время выполнения (на 15 сек. становится дольше). Так что же это?! Низкое качество генерируемого кода компилятором C++Builder в сравнении с компилятором Delphi?? Специалисты! Помогите! Проясните ситуацию. Какой же компилятор лучше - C++Builder или компилятор Delphi?? Или возможно как-то добиться той же эффективности кода, настроив как-то компилятор С++ в С++Builder? Очень благодарен за ответы с пояснением!

PS Ещё заметил такой прикол, что если в С++Builder вместо просто цикла от 1 до миллиарда использовать 2 равносильных цикла, т.е. один вложенный в другой: внешний от 1 до миллиона, а внутренний от 1 до тысячи, вот тогда как ни парадоксально скорость выполнения 2х циклов быстрее в 5 раз чем просто одного от 1 до миллиарда! Т.Е. вариант:
 for (int i = 0; i < 1000000000; i++);
много медленее, чем вариант:
for(int i = 1; i < 1000000; i++)
    for(int j = 1; j < 1000; j++);
!!?? Получается что если нам надо выполнить какие-то действия в программе миллиард раз, нужно это сделать не в одном цикле, а задать внешний цикл от 1 до миллиона и внутренний от 1 до тысячи, например, и в теле внутреннего описать все действия!!??

Максим

Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру


Всего в теме 346 сообщений

Добавить свое сообщение

Отслеживать это обсуждение


Смотрите также обсуждения:
Средства разработки. Языки программирования.
  • Delphi 4 or Delphi 5
  • Что приобрести в качестве средства разработки?
  • Delphi6
  • Delphi vs PowerBuilder
  • Вот и вышла Delphi 7... Вы рады?
  • Функциональное программирование

  • <<<... | 326—317 | 316—307 | 306—297 | ...>>>
    Всего сообщений в теме: 346; страниц: 35; текущая страница: 4


    № 316   28-08-2007 03:53 Ответить на это сообщение Ответить на это сообщение с цитированием
    Тут в соседней ветке уже проскакивала ссылка на статью http://stfw.ru/page.php?id=5112

    Цитата оттуда:

    Тем не менее, именно те свойства языка C, которые делают его использование источником дыр в больших программах, привели к его популярности среди незрелых киддисов от программирования, рассматривающих его как игру, соревнование, арену демонстрации собственного «интеллекта». Важно понимать, что подобные явления не являются специфичными для программирования: в филологии и детской психологии хорошо известно аналогичное явление «детского фольклора» (страшилки и т.п.), демонстрирующее устойчивость на протяжении многих десятилетий. Таким образом, можно говорить о стихийном распространении своеобразной мифологии вокруг языка C и его производных, коренящейся в естественном недостатке знаний и опыта, а также в особенностях психики юных программеров - желания самоутвердиться среди сверстников («настоящие программеры пишут на C») и т.д.

    <...>

    Стихийное распространение в среде юных партизан от программирования порочной мифологии, возникшей вокруг языков C/C++, имеет резоны в примитивных архетипах подростковой психологии.


    Лучше обо всём этом семействе С/С++ не скажешь :)

    Ещё хорошая цитата оттуда:

    Известны 10 преимуществ Паскаля перед Си:) Я приведу только одно, но самое важное:
    На Си Вы можете написать:

    Код:
    for(;P("\n").R-;P("\ "))for(e=3DC;e-;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2);

    На Паскале Вы НЕ МОЖЕТЕ такого написать.


    № 315   28-08-2007 03:30 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 312« (Alexander)
    ___________________________

    Лично я считаю что на языках семейства Си писать легче.
    Писать - легче. Читать - сложнее.
    Я всегда впадаю в легкий ступор, когда надо быстро разобраться в конструкциях вида

    int i=5;
    i = ++i + ++i;



    № 314   28-08-2007 03:27 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 309« (Alexander)
    ___________________________

    В чем причина популярности Паскаля?
    Сколько не смотрел разных оценок популярности языков, семейство C/C++ всегда обходило Delphi (даже если добавить FreePascal).


    № 313   28-08-2007 03:23 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 310« (Geo)
    ___________________________

    Естественно, если я вдруг ни с того ни с сего задумаю создать, например, 3D-шутер, то не буду этого делать на Delphi :-D
    Ну... 3D-шутеров на Delphi я тоже не видел, но вообще игры пишут. И вполне успешные. Та же серия Age of Wonders, например.


    № 312   28-08-2007 03:21 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 311« (Cepгей Poщин)
    ___________________________
    Один из моих аргументов о которых я не сказал:
    удобность синтаксиса C++. Лично я считаю что
    на языках семейства Си писать легче. В частности
    в школе и в универе меня так и не смогли научить Паскалю, что
    ни как не мешает мне писать проги в C++Buider и Microsoft Visual C++


    № 311   28-08-2007 02:51 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 309« (Alexander)
    ___________________________
    преимуществ больше у Си (перечислять не буду)...
    Прошу не давать голословных...
    Аргументируйте свой ответ...
    Т.е. сами аргументировать не хотите, а нас заставляете...
    Если быть кратким, то в разных обсуждениях высказывалась мысль: и в Pascal и в C можно прострелить себе ногу, но в C это сделать гораздо проще, отсюда в Pascal ниже порог вхождения. Т.е. что-то напрограммировать ни чего не зная о программировании на Pascal можно, а на C — нет.
     Cep


    № 310   28-08-2007 02:49 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 309« (Alexander)
    ___________________________
    С одной стороны, эффективность компилятора Delphi заметно выросла (если сравнивать с тем же Turbo Pascal). С другой стороны, на современном этапе развития компьютерной техники и программного обеспечения при создании больших систем уменьшение размеров кода и повышение быстродействия не являются критичными. На первое место выходит скорость и удобство разработки. Поэтому, Delphi теснит конкурентов. Легко читаемые тексты (псевдопаскалевский язык используется даже для описания работы алгоритмов, так как он прост и понятен), удобная среда разработки (я их видел, конечно, далеко не все, но IDE Delphi -- лучшее, что я видел; Microsoft отдыхает в стороонке) и ориентация на разработку приложений баз данных (наиболее популярное направление разработки больших систем сейчас).

    Естественно, если я вдруг ни с того ни с сего задумаю создать, например, 3D-шутер, то не буду этого делать на Delphi :-D
     Geo


    № 309   28-08-2007 01:56 Ответить на это сообщение Ответить на это сообщение с цитированием
    Здравствуйте уважаемые Господа!
    Обращаюсь я к Вам с не совсем традиционным
    вопросом. Некоторым он может показаться
    наивным, некоторым риторическим, некоторым
    глупым, не хотите не отвечайте.
    Я студент технического ВУЗа, моя специальность
    связана напрямую с программированием. Собственно
    его изучениям я занимаюсь почти с начальной школы.
    Я всегда отдавал предпочтение языкам семейства Си,
    мне кажется что, преимуществ больше у Си (перечислять не буду).
    Многие этому удивляются, спрашиваю почему не Паскаль.

    Внимание вопрос:
    В чем причина популярности Паскаля? Почему
    так много людей пишущих на Delphi?
    Грубо говоря: что у него есть чего нет Си?

    Прошу не давать голословных ответов вроде:
    -Синтаксис паскаля легче.
    -Люди привыкли к нему.
    Аргументируйте свой ответ.


    № 308   16-08-2007 02:59 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 47 в теме №381 на БП« (vit)
    ___________________________

    Не ерунда, а суровая правда жизни. Тестик с www.sql.ru - перебор всех возможных перестановок элементов массива:


    Скачал я оттуда тестик. Об уровне тамошних тестеров красноречиво говорит код:


    for m:=razmer downto 2 do
      if b[m]>b[m-1] then
        break;
    if m=1 then
      Break;



    FPC уходит в бесконечный цикл. В Delphi случайно (!) работает как задумывалось.

    После того, как переписал как положено, в FPC с включенными оптимизациями, время действительно получилось в два раза больше, чем в Delphi. Глянул дизассемблер, отключил range checking, overflow checking и т.п. И получил конечный результат:
    Delphi 7:
      Count: 39916800
      Time: 2500(ms)
    FPC 2.1.4:
      Count: 39916800
      Time: 3281(ms)

    Разница около 30%. Если учесть, что тут сравнивается именно производительность кода (все данные в кэше), то это незначительно. В реальных приложениях, с обменом данными с памятью, разница будет почти незаметна, что и показывают другие тесты.


    № 307   09-07-2007 14:50 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 306« (Марина)
    ___________________________

    Установка директивы inline дала обратный эффект.


    А оно заинлайнилось? В CPU view что видно? У меня D7, сам проверить не могу.

    А вообще хорошо что перегруженные операторы тормозят - не будут перегружать где попало и что попало.


    <<<... | 326—317 | 316—307 | 306—297 | ...>>>
    Всего сообщений в теме: 346; страниц: 35; текущая страница: 4


    Добавить свое сообщение

    Отслеживать это обсуждение

    Дополнительная навигация:
    Количество сообщений на странице

    Порядок сортировки сообщений
    Новое сообщение вверху списка (сетевая хронология)
    Первое сообщение вверху списка (обычная хронология)

    Перейти на конкретную страницу по номеру
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования